Treasure Map Drawing Bot You're organizing a treasure hunt for your friends. To conduct things more easily, you want to draw a map of all locations where you hid the precious objects.
Input
Any form of input denoting a list of points consisting of (nonnegative) x- and y-coordinate, 0 0 being the upper left corner is permitted (Note: You may also use 1-based indexing in your answer, please comment on that if you do). Example:
1 2
3 0
0 1

Challenge
Your function or program should be able to construct a map denoting every given location with an x where the mark is found in row y + 1 and column x + 1 in the output. Unmarked locations are represented with a  . The map also consists of a frame where the corners are +s, the vertical lines are |s and the horizontal lines are -s. Your solution should output the smallest possible frame. Map for the input example given above:
+----+
|   x|
|x   |
| x  |
+----+

Possible Test Cases

&quot;0 0&quot;
=&gt;
+-+
|x|
+-+


&quot;0 10
 5 5
 10 0&quot;
=&gt;
+-----------+
|          x|
|           |
|           |
|           |
|           |
|     x     |
|           |
|           |
|           |
|           |
|x          |
+-----------+


&quot;&quot;
=&gt;
++
++


&quot;0 0
 0 2
 2 0&quot;
=&gt;
+---+
|x x|
|   |
|x  |
+---+


Of course, this is code-golf, meaning that the solution with the lowest byte count wins! Explanations of your solution are encouraged.
J, 37 34 bytes

0&lt;@|:' x'{~((i.@]e.#.~)1+&gt;./) ::#:


Try it online!

                       1+&gt;./          maximum for each coordinate + 1
             i.@]                     make an array with these dimensions filled with 0..x*y
                                      /* if the input is empty, 
                                         1+&gt;./ is negative infinity
                                         and i.@] throws an error  */
                   #.~                mixed base conversion of input
                 e.                   replace the elements of i.@]
                                        with 1 if it's present in the
                                        converted input, 0 otherwise
           (                ) ::      if there's an error do the other thing instead
                                #:    "to binary", for empty input this returns a 0x0 matrix
0&lt;@|:' x'{~                           index into character string, transpose and put in a box