Documentation Source Text

Hex Artifact Content
Login

Artifact 494aed173de4f01e7f9651d36061e1f6d04217fd9e6dbbd76dec1e525d1d29fb:


0000: 3c 74 69 74 6c 65 3e 54 68 65 20 47 65 6f 70 6f  <title>The Geopo
0010: 6c 79 20 49 6e 74 65 72 66 61 63 65 20 54 6f 20  ly Interface To 
0020: 54 68 65 20 53 51 4c 69 74 65 20 52 2a 54 72 65  The SQLite R*Tre
0030: 65 20 4d 6f 64 75 6c 65 3c 2f 74 69 74 6c 65 3e  e Module</title>
0040: 0a 3c 74 63 6c 3e 68 64 5f 6b 65 79 77 6f 72 64  .<tcl>hd_keyword
0050: 73 20 7b 67 65 6f 70 6f 6c 79 7d 20 7b 47 65 6f  s {geopoly} {Geo
0060: 70 6f 6c 79 20 6d 6f 64 75 6c 65 7d 3c 2f 74 63  poly module}</tc
0070: 6c 3e 0a 3c 74 61 62 6c 65 5f 6f 66 5f 63 6f 6e  l>.<table_of_con
0080: 74 65 6e 74 73 3e 0a 0a 3c 68 31 3e 4f 76 65 72  tents>..<h1>Over
0090: 76 69 65 77 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 54  view</h1>..<p>.T
00a0: 68 65 20 47 65 6f 70 6f 6c 79 20 6d 6f 64 75 6c  he Geopoly modul
00b0: 65 20 69 73 20 61 6e 20 61 6c 74 65 72 6e 61 74  e is an alternat
00c0: 69 76 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f  ive interface to
00d0: 20 74 68 65 20 5b 52 2d 54 72 65 65 20 65 78 74   the [R-Tree ext
00e0: 65 6e 73 69 6f 6e 5d 20 74 68 61 74 20 75 73 65  ension] that use
00f0: 73 0a 74 68 65 20 5b 68 74 74 70 3a 2f 2f 67 65  s.the [http://ge
0100: 6f 6a 73 6f 6e 2e 6f 72 67 20 7c 20 47 65 6f 4a  ojson.org | GeoJ
0110: 53 4f 4e 5d 20 6e 6f 74 61 74 69 6f 6e 0a 28 5b  SON] notation.([
0120: 68 74 74 70 73 3a 2f 2f 74 6f 6f 6c 73 2e 69 65  https://tools.ie
0130: 74 66 2e 6f 72 67 2f 68 74 6d 6c 2f 72 66 63 37  tf.org/html/rfc7
0140: 39 34 36 20 7c 20 52 46 43 2d 37 39 34 36 5d 29  946 | RFC-7946])
0150: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 77 6f   to describe two
0160: 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 0a 70 6f 6c  -dimensional.pol
0170: 79 67 6f 6e 73 2e 20 20 47 65 6f 70 6f 6c 79 20  ygons.  Geopoly 
0180: 69 6e 63 6c 75 64 65 73 20 66 75 6e 63 74 69 6f  includes functio
0190: 6e 73 20 66 6f 72 20 64 65 74 65 63 74 69 6e 67  ns for detecting
01a0: 20 77 68 65 6e 20 6f 6e 65 20 70 6f 6c 79 67 6f   when one polygo
01b0: 6e 73 20 69 73 0a 63 6f 6e 74 61 69 6e 65 64 20  ns is.contained 
01c0: 77 69 74 68 69 6e 20 6f 72 20 6f 76 65 72 6c 61  within or overla
01d0: 70 73 20 77 69 74 68 20 61 6e 6f 74 68 65 72 2c  ps with another,
01e0: 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
01f0: 68 65 0a 61 72 65 61 20 63 6f 6e 74 61 69 6e 65  he.area containe
0200: 64 20 77 69 74 68 69 6e 20 61 20 70 6f 6c 79 67  d within a polyg
0210: 6f 6e 2c 20 66 6f 72 20 64 6f 69 6e 67 20 6c 69  on, for doing li
0220: 6e 65 61 72 20 74 72 61 73 66 6f 72 6d 61 74 69  near trasformati
0230: 6f 6e 73 20 6f 66 20 70 6f 6c 79 67 6f 6e 73 2c  ons of polygons,
0240: 0a 66 6f 72 20 72 65 6e 64 65 72 69 6e 67 20 70  .for rendering p
0250: 6f 6c 79 67 6f 6e 73 20 61 73 0a 5b 68 74 74 70  olygons as.[http
0260: 73 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61  s://en.wikipedia
0270: 2e 6f 72 67 2f 77 69 6b 69 2f 53 63 61 6c 61 62  .org/wiki/Scalab
0280: 6c 65 5f 56 65 63 74 6f 72 5f 47 72 61 70 68 69  le_Vector_Graphi
0290: 63 73 20 7c 20 53 56 47 5d 2c 20 61 6e 64 20 6f  cs | SVG], and o
02a0: 74 68 65 72 0a 73 69 6d 69 6c 61 72 20 6f 70 65  ther.similar ope
02b0: 72 61 74 69 6f 6e 73 2e 0a 0a 3c 70 3e 0a 47 65  rations...<p>.Ge
02c0: 6f 70 6f 6c 79 20 6f 70 65 72 61 74 65 73 20 6f  opoly operates o
02d0: 6e 20 22 73 69 6d 70 6c 65 22 20 70 6f 6c 79 67  n "simple" polyg
02e0: 6f 6e 73 20 2d 20 74 68 61 74 20 69 73 2c 20 70  ons - that is, p
02f0: 6f 6c 79 67 6f 6e 73 20 66 6f 72 20 77 68 69 63  olygons for whic
0300: 68 0a 74 68 65 20 62 6f 75 6e 64 61 72 79 20 64  h.the boundary d
0310: 6f 65 73 20 6e 6f 74 20 69 6e 74 65 72 73 65 63  oes not intersec
0320: 74 20 69 74 73 65 6c 66 2e 20 20 47 65 6f 70 6f  t itself.  Geopo
0330: 6c 79 20 74 68 75 73 20 65 78 74 65 6e 64 73 20  ly thus extends 
0340: 74 68 65 20 63 61 70 61 62 69 6c 69 74 69 65 73  the capabilities
0350: 0a 6f 66 20 74 68 65 20 5b 52 2d 54 72 65 65 20  .of the [R-Tree 
0360: 65 78 74 65 6e 73 69 6f 6e 5d 20 77 68 69 63 68  extension] which
0370: 20 63 61 6e 20 6f 6e 6c 79 20 64 65 61 6c 20 77   can only deal w
0380: 69 74 68 20 72 65 63 74 61 6e 67 75 6c 61 72 20  ith rectangular 
0390: 61 72 65 61 73 2e 0a 4f 6e 20 74 68 65 20 6f 74  areas..On the ot
03a0: 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 5b 52  her hand, the [R
03b0: 2d 54 72 65 65 20 65 78 74 65 6e 73 69 6f 6e 5d  -Tree extension]
03c0: 20 69 73 0a 61 62 6c 65 20 74 6f 20 68 61 6e 64   is.able to hand
03d0: 6c 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  le between 1 and
03e0: 20 35 20 63 6f 6f 72 64 69 6e 61 74 65 20 64 69   5 coordinate di
03f0: 6d 65 6e 73 69 6f 6e 73 2c 20 77 68 65 72 65 61  mensions, wherea
0400: 73 20 47 65 6f 70 6f 6c 79 20 69 73 20 72 65 73  s Geopoly is res
0410: 74 72 69 63 74 65 64 0a 74 6f 20 32 2d 64 69 6d  tricted.to 2-dim
0420: 65 6e 73 69 6f 6e 61 6c 20 73 68 61 70 65 73 20  ensional shapes 
0430: 6f 6e 6c 79 2e 0a 0a 3c 70 3e 0a 45 61 63 68 20  only...<p>.Each 
0440: 70 6f 6c 79 67 6f 6e 20 69 6e 20 74 68 65 20 47  polygon in the G
0450: 65 6f 70 6f 6c 79 20 6d 6f 64 75 6c 65 20 63 61  eopoly module ca
0460: 6e 20 62 65 20 61 73 73 6f 63 69 61 74 65 64 20  n be associated 
0470: 77 69 74 68 20 61 6e 20 61 72 62 69 74 72 61 72  with an arbitrar
0480: 79 0a 6e 75 6d 62 65 72 20 6f 66 20 61 75 78 69  y.number of auxi
0490: 6c 69 61 72 79 20 64 61 74 61 20 66 69 65 6c 64  liary data field
04a0: 73 2e 0a 0a 3c 68 32 3e 47 65 6f 4a 53 4f 4e 3c  s...<h2>GeoJSON<
04b0: 2f 68 32 3e 0a 0a 3c 70 3e 54 68 65 20 5b 68 74  /h2>..<p>The [ht
04c0: 74 70 73 3a 2f 2f 74 6f 6f 6c 73 2e 69 65 74 66  tps://tools.ietf
04d0: 2e 6f 72 67 2f 68 74 6d 6c 2f 72 66 63 37 39 34  .org/html/rfc794
04e0: 36 7c 20 47 65 6f 4a 53 4f 4e 20 73 74 61 6e 64  6| GeoJSON stand
04f0: 61 72 64 5d 20 69 73 20 73 79 6e 74 61 78 20 66  ard] is syntax f
0500: 6f 72 0a 65 78 63 68 61 6e 67 69 6e 67 20 67 65  or.exchanging ge
0510: 6f 73 70 61 74 69 61 6c 20 69 6e 66 6f 72 6d 61  ospatial informa
0520: 74 69 6f 6e 20 75 73 69 6e 67 20 4a 53 4f 4e 2e  tion using JSON.
0530: 20 20 47 65 6f 4a 53 4f 4e 20 69 73 20 61 20 72    GeoJSON is a r
0540: 69 63 68 20 73 74 61 6e 64 61 72 64 0a 74 68 61  ich standard.tha
0550: 74 20 63 61 6e 20 64 65 73 63 72 69 62 65 20 6e  t can describe n
0560: 65 61 72 6c 79 20 61 6e 79 20 6b 69 6e 64 20 6f  early any kind o
0570: 66 20 67 65 6f 73 70 61 74 69 61 6c 20 63 6f 6e  f geospatial con
0580: 74 65 6e 74 2e 0a 0a 3c 70 3e 54 68 65 20 47 65  tent...<p>The Ge
0590: 6f 70 6f 6c 79 20 6d 6f 64 75 6c 65 20 6f 6e 6c  opoly module onl
05a0: 79 20 75 6e 64 65 72 73 74 61 6e 64 73 0a 61 20  y understands.a 
05b0: 73 6d 61 6c 6c 20 73 75 62 73 65 74 20 6f 66 20  small subset of 
05c0: 47 65 6f 4a 53 4f 4e 2c 20 62 75 74 20 61 20 63  GeoJSON, but a c
05d0: 72 69 74 69 63 61 6c 20 73 75 62 73 65 74 2e 20  ritical subset. 
05e0: 20 0a 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c   .In particular,
05f0: 20 47 65 6f 4a 53 4f 4e 20 75 6e 64 65 72 73 74   GeoJSON underst
0600: 61 6e 64 73 0a 74 68 65 20 4a 53 4f 4e 20 61 72  ands.the JSON ar
0610: 72 61 79 20 6f 66 20 76 65 72 74 65 78 65 73 20  ray of vertexes 
0620: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
0630: 20 73 69 6d 70 6c 65 20 70 6f 6c 79 67 6f 6e 2e   simple polygon.
0640: 0a 0a 3c 70 3e 41 20 70 6f 6c 79 67 6f 6e 20 69  ..<p>A polygon i
0650: 73 20 64 65 66 69 6e 65 64 20 62 79 20 69 74 73  s defined by its
0660: 20 76 65 72 74 65 78 65 73 2e 0a 45 61 63 68 20   vertexes..Each 
0670: 76 65 72 74 65 78 20 69 73 20 61 20 4a 53 4f 4e  vertex is a JSON
0680: 20 61 72 72 61 79 20 6f 66 20 74 77 6f 20 6e 75   array of two nu
0690: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 77 68 69  meric values whi
06a0: 63 68 20 61 72 65 20 74 68 65 0a 58 20 61 6e 64  ch are the.X and
06b0: 20 59 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 6f   Y coordinates o
06c0: 66 20 74 68 65 20 76 65 72 74 65 78 2e 0a 41 20  f the vertex..A 
06d0: 70 6f 6c 79 67 6f 6e 20 69 73 20 61 20 4a 53 4f  polygon is a JSO
06e0: 4e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73 65  N array of these
06f0: 20 76 65 72 74 65 78 65 73 2c 20 61 6e 64 20 68   vertexes, and h
0700: 65 6e 63 65 20 69 73 20 61 6e 20 61 72 72 61 79  ence is an array
0710: 0a 6f 66 20 61 72 72 61 79 73 2e 0a 54 68 65 20  .of arrays..The 
0720: 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76  first and last v
0730: 65 72 74 65 78 20 69 6e 20 74 68 65 20 61 72 72  ertex in the arr
0740: 61 79 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ay must be the s
0750: 61 6d 65 2e 0a 54 68 65 20 70 6f 6c 79 67 6f 6e  ame..The polygon
0760: 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 72 69 67   follows the rig
0770: 68 74 2d 68 61 6e 64 20 72 75 6c 65 3a 20 20 57  ht-hand rule:  W
0780: 68 65 6e 20 74 72 61 63 69 6e 67 20 61 20 6c 69  hen tracing a li
0790: 6e 65 20 66 72 6f 6d 0a 6f 6e 65 20 76 65 72 74  ne from.one vert
07a0: 65 78 20 74 6f 20 74 68 65 20 6e 65 78 74 2c 20  ex to the next, 
07b0: 74 68 65 20 61 72 65 61 20 74 6f 20 74 68 65 20  the area to the 
07c0: 72 69 67 68 74 20 6f 66 20 74 68 65 20 6c 69 6e  right of the lin
07d0: 65 20 69 73 20 6f 75 74 73 69 64 65 0a 6f 66 20  e is outside.of 
07e0: 74 68 65 20 70 6f 6c 79 67 6f 6e 20 61 6e 64 20  the polygon and 
07f0: 74 68 65 20 61 72 65 61 20 74 6f 20 74 68 65 20  the area to the 
0800: 6c 65 66 74 20 69 73 20 69 6e 73 69 64 65 20 74  left is inside t
0810: 68 65 20 70 6f 6c 79 67 6f 6e 2e 0a 49 6e 20 6f  he polygon..In o
0820: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
0830: 6e 65 74 20 72 6f 74 61 74 69 6f 6e 20 6f 66 20  net rotation of 
0840: 74 68 65 20 76 65 72 74 65 78 65 73 20 69 73 20  the vertexes is 
0850: 63 6f 75 6e 74 65 72 2d 63 6c 6f 63 6b 77 69 73  counter-clockwis
0860: 65 2e 0a 0a 3c 70 3e 0a 46 6f 72 20 65 78 61 6d  e...<p>.For exam
0870: 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ple, the followi
0880: 6e 67 20 4a 53 4f 4e 20 64 65 73 63 72 69 62 65  ng JSON describe
0890: 73 20 61 6e 20 69 73 6f 73 63 65 6c 65 73 20 74  s an isosceles t
08a0: 72 69 61 6e 67 6c 65 2c 20 73 69 74 74 69 6e 67  riangle, sitting
08b0: 0a 6f 6e 20 74 68 65 20 58 20 61 63 63 65 73 73  .on the X access
08c0: 20 61 6e 64 20 77 69 74 68 20 61 6e 20 61 72 65   and with an are
08d0: 61 20 6f 66 20 30 2e 35 3a 0a 0a 3c 63 6f 64 65  a of 0.5:..<code
08e0: 62 6c 6f 63 6b 3e 0a 26 23 39 31 3b 26 23 39 31  block>.&#91;&#91
08f0: 3b 30 2c 30 5d 2c 26 23 39 31 3b 31 2c 30 5d 2c  ;0,0],&#91;1,0],
0900: 26 23 39 31 3b 30 2e 35 2c 31 5d 2c 26 23 39 31  &#91;0.5,1],&#91
0910: 3b 30 2c 30 5d 5d 0a 3c 2f 63 6f 64 65 62 6c 6f  ;0,0]].</codeblo
0920: 63 6b 3e 0a 0a 3c 70 3e 0a 41 20 74 72 69 61 6e  ck>..<p>.A trian
0930: 67 6c 65 20 68 61 73 20 74 68 72 65 65 20 76 65  gle has three ve
0940: 72 74 65 78 65 73 2c 20 62 75 74 20 74 68 65 20  rtexes, but the 
0950: 47 65 6f 4a 53 4f 4e 20 64 65 73 63 72 69 70 74  GeoJSON descript
0960: 69 6f 6e 20 6f 66 20 74 68 65 20 74 72 69 61 6e  ion of the trian
0970: 67 6c 65 0a 68 61 73 20 34 20 76 65 72 74 65 78  gle.has 4 vertex
0980: 65 73 20 62 65 63 61 75 73 65 20 74 68 65 20 66  es because the f
0990: 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 65  irst and last ve
09a0: 72 74 65 78 20 61 72 65 20 64 75 70 6c 69 63 61  rtex are duplica
09b0: 74 65 73 2e 0a 0a 3c 68 32 3e 42 69 6e 61 72 79  tes...<h2>Binary
09c0: 20 73 74 6f 72 61 67 65 20 66 6f 72 6d 61 74 3c   storage format<
09d0: 2f 68 32 3e 0a 0a 3c 70 3e 0a 49 6e 74 65 72 6e  /h2>..<p>.Intern
09e0: 61 6c 6c 79 2c 20 47 65 6f 70 6f 6c 79 20 73 74  ally, Geopoly st
09f0: 6f 72 65 73 20 70 6f 6c 79 67 6f 6e 73 20 69 6e  ores polygons in
0a00: 20 61 20 62 69 6e 61 72 79 20 66 6f 72 6d 61 74   a binary format
0a10: 20 2d 20 61 6e 20 53 51 4c 20 42 4c 4f 42 2e 0a   - an SQL BLOB..
0a20: 44 65 74 61 69 6c 73 20 6f 66 20 74 68 65 20 62  Details of the b
0a30: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 61 72 65  inary format are
0a40: 20 67 69 76 65 6e 20 62 65 6c 6f 77 2e 0a 41 6c   given below..Al
0a50: 6c 20 6f 66 20 74 68 65 20 47 65 6f 70 6f 6c 79  l of the Geopoly
0a60: 20 69 6e 74 65 72 66 61 63 65 73 20 61 72 65 20   interfaces are 
0a70: 61 62 6c 65 20 74 6f 20 61 63 63 65 70 74 20 70  able to accept p
0a80: 6f 6c 79 67 6f 6e 73 20 69 6e 20 65 69 74 68 65  olygons in eithe
0a90: 72 20 74 68 65 0a 47 65 6f 4a 53 4f 4e 20 66 6f  r the.GeoJSON fo
0aa0: 72 6d 61 74 20 6f 72 20 69 6e 20 74 68 65 20 62  rmat or in the b
0ab0: 69 6e 61 72 79 20 66 6f 72 6d 61 74 2e 0a 0a 3c  inary format...<
0ac0: 68 31 3e 55 73 69 6e 67 20 54 68 65 20 47 65 6f  h1>Using The Geo
0ad0: 70 6f 6c 79 20 45 78 74 65 6e 73 69 6f 6e 3c 2f  poly Extension</
0ae0: 68 31 3e 0a 0a 3c 70 3e 0a 41 20 67 65 6f 70 6f  h1>..<p>.A geopo
0af0: 6c 79 20 74 61 62 6c 65 20 69 73 20 63 72 65 61  ly table is crea
0b00: 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
0b10: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 43 52 45  .<codeblock>.CRE
0b20: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0b30: 45 20 6e 65 77 74 61 62 20 55 53 49 4e 47 20 67  E newtab USING g
0b40: 65 6f 70 6f 6c 79 28 61 2c 62 2c 63 29 3b 0a 3c  eopoly(a,b,c);.<
0b50: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
0b60: 0a 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61  .The statement a
0b70: 62 6f 76 65 20 63 72 65 61 74 65 73 20 61 20 6e  bove creates a n
0b80: 65 77 20 67 65 6f 70 6f 6c 79 20 74 61 62 6c 65  ew geopoly table
0b90: 20 6e 61 6d 65 64 20 22 6e 65 77 74 61 62 22 2e   named "newtab".
0ba0: 0a 45 76 65 72 79 20 67 65 6f 70 6f 6c 79 20 74  .Every geopoly t
0bb0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  able contains a 
0bc0: 62 75 69 6c 74 2d 69 6e 20 69 6e 74 65 67 65 72  built-in integer
0bd0: 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 0a   "rowid" column.
0be0: 61 6e 64 20 61 20 22 5f 73 68 61 70 65 22 20 63  and a "_shape" c
0bf0: 6f 6c 75 6d 6e 20 74 68 61 74 20 63 6f 6e 74 61  olumn that conta
0c00: 69 6e 73 0a 74 68 65 20 70 6f 6c 79 67 6f 6e 20  ins.the polygon 
0c10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0c20: 74 68 61 74 20 72 6f 77 20 6f 66 20 74 68 65 20  that row of the 
0c30: 74 61 62 6c 65 2e 0a 54 68 65 20 65 78 61 6d 70  table..The examp
0c40: 6c 65 20 61 62 6f 76 65 20 61 6c 73 6f 20 64 65  le above also de
0c50: 66 69 6e 65 73 20 74 68 72 65 65 20 61 75 78 69  fines three auxi
0c60: 6c 69 61 72 79 20 64 61 74 61 20 63 6f 6c 75 6d  liary data colum
0c70: 6e 73 20 0a 6e 61 6d 65 64 20 22 61 22 2c 20 22  ns .named "a", "
0c80: 62 22 2c 20 61 6e 64 20 22 63 22 20 74 68 61 74  b", and "c" that
0c90: 20 63 61 6e 20 73 74 6f 72 65 20 77 68 61 74 65   can store whate
0ca0: 76 65 72 20 61 64 64 69 74 69 6f 6e 61 6c 0a 69  ver additional.i
0cb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 65 20 61  nformation the a
0cc0: 70 70 6c 69 63 61 74 69 6f 6e 20 6e 65 65 64 73  pplication needs
0cd0: 20 74 6f 20 61 73 73 6f 63 69 61 74 65 0a 77 69   to associate.wi
0ce0: 74 68 20 65 61 63 68 20 70 6f 6c 79 67 6f 6e 2e  th each polygon.
0cf0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
0d00: 20 6e 65 65 64 20 74 6f 20 73 74 6f 72 65 20 61   need to store a
0d10: 75 78 69 6c 69 61 72 79 0a 69 6e 66 6f 72 6d 61  uxiliary.informa
0d20: 74 69 6f 6e 2c 20 74 68 65 20 6c 69 73 74 20 6f  tion, the list o
0d30: 66 20 61 75 78 69 6c 69 61 72 79 20 63 6f 6c 75  f auxiliary colu
0d40: 6d 6e 73 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  mns can be omitt
0d50: 65 64 2e 0a 0a 3c 70 3e 0a 53 74 6f 72 65 20 6e  ed...<p>.Store n
0d60: 65 77 20 70 6f 6c 79 67 6f 6e 73 20 69 6e 20 74  ew polygons in t
0d70: 68 65 20 74 61 62 6c 65 20 75 73 69 6e 67 20 6f  he table using o
0d80: 72 64 69 6e 61 72 79 20 49 4e 53 45 52 54 20 73  rdinary INSERT s
0d90: 74 61 74 65 6d 65 6e 74 73 3a 0a 0a 3c 63 6f 64  tatements:..<cod
0da0: 65 62 6c 6f 63 6b 3e 0a 49 4e 53 45 52 54 20 49  eblock>.INSERT I
0db0: 4e 54 4f 20 6e 65 77 74 61 62 28 5f 73 68 61 70  NTO newtab(_shap
0dc0: 65 29 20 56 41 4c 55 45 53 28 27 26 23 39 31 3b  e) VALUES('&#91;
0dd0: 26 23 39 31 3b 30 2c 30 5d 2c 26 23 39 31 3b 31  &#91;0,0],&#91;1
0de0: 2c 30 5d 2c 26 23 39 31 3b 30 2e 35 2c 31 5d 2c  ,0],&#91;0.5,1],
0df0: 26 23 39 31 3b 30 2c 30 5d 5d 27 29 3b 0a 3c 2f  &#91;0,0]]');.</
0e00: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
0e10: 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54  UPDATE and DELET
0e20: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77 6f 72  E statements wor
0e30: 6b 20 73 69 6d 69 6c 61 72 6c 79 2e 0a 0a 3c 68  k similarly...<h
0e40: 32 3e 51 75 65 72 69 65 73 3c 2f 68 32 3e 0a 0a  2>Queries</h2>..
0e50: 3c 70 3e 0a 54 6f 20 71 75 65 72 79 20 74 68 65  <p>.To query the
0e60: 20 67 65 6f 70 6f 6c 79 20 74 61 62 6c 65 20 75   geopoly table u
0e70: 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 65 64 20  sing an indexed 
0e80: 67 65 6f 73 70 61 74 69 61 6c 20 73 65 61 72 63  geospatial searc
0e90: 68 2c 20 0a 75 73 65 20 6f 6e 65 20 6f 66 20 74  h, .use one of t
0ea0: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 67 65 6f  he functions geo
0eb0: 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 29 0a 6f  poly_overlap().o
0ec0: 72 20 67 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e  r geopoly_within
0ed0: 28 29 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20  () as a boolean 
0ee0: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  function in the 
0ef0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 0a 77 69  WHERE clause,.wi
0f00: 74 68 20 74 68 65 20 22 5f 73 68 61 70 65 22 20  th the "_shape" 
0f10: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 66 69  column as the fi
0f20: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
0f30: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 46 6f  the function..Fo
0f40: 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64  r example:..<cod
0f50: 65 62 6c 6f 63 6b 3e 0a 53 45 4c 45 43 54 20 2a  eblock>.SELECT *
0f60: 20 46 52 4f 4d 20 6e 65 77 74 61 62 20 57 48 45   FROM newtab WHE
0f70: 52 45 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c  RE geopoly_overl
0f80: 61 70 28 5f 73 68 61 70 65 2c 20 24 71 75 65 72  ap(_shape, $quer
0f90: 79 5f 70 6f 6c 79 67 6f 6e 29 3b 0a 3c 2f 63 6f  y_polygon);.</co
0fa0: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 54 68  deblock>..<p>.Th
0fb0: 65 20 70 72 65 76 69 6f 75 73 20 65 78 61 6d 70  e previous examp
0fc0: 6c 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 65  le will return e
0fd0: 76 65 72 79 20 72 6f 77 20 66 6f 72 20 77 68 69  very row for whi
0fe0: 63 68 20 74 68 65 20 5f 73 68 61 70 65 0a 6f 76  ch the _shape.ov
0ff0: 65 72 6c 61 70 73 20 74 68 65 20 70 6f 6c 79 67  erlaps the polyg
1000: 6f 6e 20 69 6e 20 74 68 65 20 24 71 75 65 72 79  on in the $query
1010: 5f 70 6f 6c 79 67 6f 6e 20 70 61 72 61 6d 65 74  _polygon paramet
1020: 65 72 2e 20 20 54 68 65 0a 67 65 6f 70 6f 6c 79  er.  The.geopoly
1030: 5f 77 69 74 68 69 6e 28 29 20 66 75 6e 63 74 69  _within() functi
1040: 6f 6e 20 77 6f 72 6b 73 20 73 69 6d 69 6c 61 72  on works similar
1050: 6c 79 2c 20 62 75 74 20 6f 6e 6c 79 20 72 65 74  ly, but only ret
1060: 75 72 6e 73 20 72 6f 77 73 20 66 6f 72 0a 77 68  urns rows for.wh
1070: 69 63 68 20 74 68 65 20 5f 73 68 61 70 65 20 69  ich the _shape i
1080: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e  s completely con
1090: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 24 71  tained within $q
10a0: 75 65 72 79 5f 70 6f 6c 79 67 6f 6e 2e 0a 0a 3c  uery_polygon...<
10b0: 70 3e 0a 51 75 65 72 79 73 20 28 61 6e 64 20 61  p>.Querys (and a
10c0: 6c 73 6f 20 44 45 4c 45 54 45 20 61 6e 64 20 55  lso DELETE and U
10d0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
10e0: 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 57  ) in which the W
10f0: 48 45 52 45 0a 63 6c 61 75 73 65 20 63 6f 6e 74  HERE.clause cont
1100: 61 69 6e 73 20 61 20 62 61 72 65 20 67 65 6f 70  ains a bare geop
1110: 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 29 20 6f 72  oly_overlap() or
1120: 20 67 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28   geopoly_within(
1130: 29 20 66 75 6e 63 74 69 6f 6e 0a 6d 61 6b 65 20  ) function.make 
1140: 75 73 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72  use of the under
1150: 6c 79 20 52 2a 54 72 65 65 20 64 61 74 61 20 73  ly R*Tree data s
1160: 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 61 20  tructures for a 
1170: 66 61 73 74 20 6c 6f 6f 6b 75 70 20 74 68 61 74  fast lookup that
1180: 0a 6f 6e 6c 79 20 68 61 73 20 74 6f 20 65 78 61  .only has to exa
1190: 6d 69 6e 65 20 61 20 73 75 62 73 65 74 20 6f 66  mine a subset of
11a0: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
11b0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6e 75 6d   table.  The num
11c0: 62 65 72 20 6f 66 0a 72 6f 77 73 20 65 78 61 6d  ber of.rows exam
11d0: 69 6e 65 73 20 64 65 70 65 6e 64 73 2c 20 6f 66  ines depends, of
11e0: 20 63 6f 75 72 73 65 2c 20 6f 6e 20 74 68 65 20   course, on the 
11f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 24 71 75 65  size of the $que
1200: 72 79 5f 70 6f 6c 79 67 6f 6e 2e 0a 4c 61 72 67  ry_polygon..Larg
1210: 65 20 24 71 75 65 72 79 5f 70 6f 6c 79 67 6f 6e  e $query_polygon
1220: 73 20 77 69 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20  s will normally 
1230: 6e 65 65 64 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  need to look at 
1240: 6d 6f 72 65 20 72 6f 77 73 20 74 68 61 6e 20 73  more rows than s
1250: 6d 61 6c 6c 0a 6f 6e 65 73 2e 0a 0a 3c 70 3e 0a  mall.ones...<p>.
1260: 51 75 65 72 69 65 73 20 61 67 61 69 6e 73 74 20  Queries against 
1270: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 67  the rowid of a g
1280: 65 6f 70 6f 6c 79 20 74 61 62 6c 65 20 61 72 65  eopoly table are
1290: 20 61 6c 73 6f 20 76 65 72 79 20 71 75 69 63 6b   also very quick
12a0: 2c 20 65 76 65 6e 0a 66 6f 72 20 74 61 62 6c 65  , even.for table
12b0: 73 20 77 69 74 68 20 61 20 76 61 73 74 20 6e 75  s with a vast nu
12c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 2e 0a 48 6f  mber of rows..Ho
12d0: 77 65 76 65 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  wever, none of t
12e0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
12f0: 61 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69 6e  a columns are in
1300: 64 65 78 65 73 2c 20 61 6e 64 20 73 6f 20 71 75  dexes, and so qu
1310: 65 72 69 65 73 0a 61 67 61 69 6e 73 74 20 74 68  eries.against th
1320: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
1330: 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 69 6e   columns will in
1340: 76 6f 6c 76 65 20 61 20 66 75 6c 6c 20 74 61 62  volve a full tab
1350: 6c 65 20 73 63 61 6e 2e 0a 0a 3c 68 31 3e 53 70  le scan...<h1>Sp
1360: 65 63 69 61 6c 20 46 75 6e 63 74 69 6f 6e 73 3c  ecial Functions<
1370: 2f 68 31 3e 0a 0a 3c 70 3e 0a 54 68 65 20 67 65  /h1>..<p>.The ge
1380: 6f 70 6f 6c 79 20 6d 6f 64 75 6c 65 20 64 65 66  opoly module def
1390: 69 6e 65 73 20 73 65 76 65 72 61 6c 20 6e 65 77  ines several new
13a0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74   SQL functions t
13b0: 68 61 74 20 61 72 65 20 75 73 65 66 75 6c 20 66  hat are useful f
13c0: 6f 72 0a 64 65 61 6c 69 6e 67 20 77 69 74 68 20  or.dealing with 
13d0: 70 6f 6c 79 67 6f 6e 73 2e 20 20 41 6c 6c 20 70  polygons.  All p
13e0: 6f 6c 79 67 6f 6e 20 61 72 67 75 6d 65 6e 74 73  olygon arguments
13f0: 20 74 6f 20 74 68 65 73 65 20 66 75 6e 63 74 69   to these functi
1400: 6f 6e 73 20 63 61 6e 20 62 65 0a 65 69 74 68 65  ons can be.eithe
1410: 72 20 74 68 65 20 47 65 6f 4a 53 4f 4e 20 66 6f  r the GeoJSON fo
1420: 72 6d 61 74 20 6f 72 20 74 68 65 20 69 6e 74 65  rmat or the inte
1430: 72 6e 61 6c 20 62 69 6e 61 72 79 20 66 6f 72 6d  rnal binary form
1440: 61 74 2e 0a 0a 3c 68 32 3e 54 68 65 20 67 65 6f  at...<h2>The geo
1450: 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 50 31 2c  poly_overlap(P1,
1460: 50 32 29 20 46 75 6e 63 74 69 6f 6e 3c 2f 68 32  P2) Function</h2
1470: 3e 0a 0a 3c 70 3e 0a 49 66 20 50 31 20 61 6e 64  >..<p>.If P1 and
1480: 20 50 32 20 61 72 65 20 62 6f 74 68 20 70 6f 6c   P2 are both pol
1490: 79 67 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  ygons, then the 
14a0: 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28  geopoly_overlap(
14b0: 50 31 2c 50 32 29 20 66 75 6e 63 74 69 6f 6e 20  P1,P2) function 
14c0: 72 65 74 75 72 6e 73 0a 74 72 75 65 20 69 66 20  returns.true if 
14d0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6f 76 65  there is any ove
14e0: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 50 31 20  rlap between P1 
14f0: 61 6e 64 20 50 32 2c 20 6f 72 20 69 74 20 72 65  and P2, or it re
1500: 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 50  turns false if P
1510: 31 20 61 6e 64 20 50 32 0a 63 6f 6d 70 6c 65 74  1 and P2.complet
1520: 65 6c 79 20 64 69 73 6a 6f 69 6e 74 2e 0a 49 66  ely disjoint..If
1530: 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32   either P1 or P2
1540: 20 69 73 20 6e 6f 74 20 61 20 70 6f 6c 79 67 6f   is not a polygo
1550: 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  n, this routine 
1560: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 0a 3c  returns NULL...<
1570: 70 3e 0a 54 68 65 20 67 65 6f 70 6f 6c 79 5f 6f  p>.The geopoly_o
1580: 76 65 72 6c 61 70 28 50 31 2c 70 32 29 20 66 75  verlap(P1,p2) fu
1590: 6e 63 74 69 6f 6e 20 69 73 20 73 70 65 63 69 61  nction is specia
15a0: 6c 20 69 6e 20 74 68 61 74 20 74 68 65 20 67 65  l in that the ge
15b0: 6f 70 6f 6c 79 20 76 69 72 74 75 61 6c 0a 74 61  opoly virtual.ta
15c0: 62 6c 65 20 6b 6e 6f 77 73 20 68 6f 77 20 74 6f  ble knows how to
15d0: 20 75 73 65 20 52 2a 54 72 65 65 20 69 6e 64 65   use R*Tree inde
15e0: 78 65 73 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  xes to optimize 
15f0: 71 75 65 72 69 65 73 20 69 6e 20 77 68 69 63 68  queries in which
1600: 20 74 68 65 20 0a 57 48 45 52 45 20 63 6c 61 75   the .WHERE clau
1610: 73 65 20 75 73 65 73 20 67 65 6f 70 6f 6c 79 5f  se uses geopoly_
1620: 6f 76 65 72 6c 61 70 28 29 20 61 73 20 61 20 62  overlap() as a b
1630: 6f 6f 6c 65 61 6e 20 66 75 6e 63 74 69 6f 6e 2e  oolean function.
1640: 20 20 4f 6e 6c 79 20 74 68 65 0a 67 65 6f 70 6f    Only the.geopo
1650: 6c 79 5f 6f 76 65 72 6c 61 70 28 50 31 2c 50 32  ly_overlap(P1,P2
1660: 29 20 61 6e 64 20 67 65 6f 70 6f 6c 79 5f 77 69  ) and geopoly_wi
1670: 74 68 69 6e 28 50 31 2c 50 32 29 20 66 75 6e 63  thin(P1,P2) func
1680: 74 69 6f 6e 73 20 68 61 76 65 20 74 68 69 73 0a  tions have this.
1690: 63 61 70 61 62 69 6c 69 74 79 2e 0a 0a 3c 68 32  capability...<h2
16a0: 3e 54 68 65 20 67 65 6f 70 6f 6c 79 5f 77 69 74  >The geopoly_wit
16b0: 68 69 6e 28 50 31 2c 50 32 29 20 46 75 6e 63 74  hin(P1,P2) Funct
16c0: 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 49 66  ion</h2>..<p>.If
16d0: 20 50 31 20 61 6e 64 20 50 32 20 61 72 65 20 62   P1 and P2 are b
16e0: 6f 74 68 20 70 6f 6c 79 67 6f 6e 73 2c 20 74 68  oth polygons, th
16f0: 65 6e 20 74 68 65 20 67 65 6f 70 6f 6c 79 5f 77  en the geopoly_w
1700: 69 74 68 69 6e 28 50 31 2c 50 32 29 20 66 75 6e  ithin(P1,P2) fun
1710: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 74 72  ction returns.tr
1720: 75 65 20 69 66 20 50 32 20 69 73 20 63 6f 6d 70  ue if P2 is comp
1730: 6c 65 74 65 6c 79 20 63 6f 6e 74 61 69 6e 65 64  letely contained
1740: 20 77 69 74 68 69 6e 20 50 31 2c 20 6f 72 20 69   within P1, or i
1750: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
1760: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 0a 50  if any part of.P
1770: 32 20 69 73 20 6f 75 74 73 69 64 65 20 6f 66 20  2 is outside of 
1780: 50 31 2e 20 20 49 66 20 50 31 20 61 6e 64 20 50  P1.  If P1 and P
1790: 32 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  2 are the same p
17a0: 6f 6c 79 67 6f 6e 2c 20 74 68 69 73 20 72 6f 75  olygon, this rou
17b0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
17c0: 65 2e 0a 49 66 20 65 69 74 68 65 72 20 50 31 20  e..If either P1 
17d0: 6f 72 20 50 32 20 69 73 20 6e 6f 74 20 61 20 70  or P2 is not a p
17e0: 6f 6c 79 67 6f 6e 2c 20 74 68 69 73 20 72 6f 75  olygon, this rou
17f0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
1800: 4c 2e 0a 0a 3c 70 3e 0a 54 68 65 20 67 65 6f 70  L...<p>.The geop
1810: 6f 6c 79 5f 77 69 74 68 69 6e 28 50 31 2c 70 32  oly_within(P1,p2
1820: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 70  ) function is sp
1830: 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20 74 68  ecial in that th
1840: 65 20 67 65 6f 70 6f 6c 79 20 76 69 72 74 75 61  e geopoly virtua
1850: 6c 0a 74 61 62 6c 65 20 6b 6e 6f 77 73 20 68 6f  l.table knows ho
1860: 77 20 74 6f 20 75 73 65 20 52 2a 54 72 65 65 20  w to use R*Tree 
1870: 69 6e 64 65 78 65 73 20 74 6f 20 6f 70 74 69 6d  indexes to optim
1880: 69 7a 65 20 71 75 65 72 69 65 73 20 69 6e 20 77  ize queries in w
1890: 68 69 63 68 20 74 68 65 20 0a 57 48 45 52 45 20  hich the .WHERE 
18a0: 63 6c 61 75 73 65 20 75 73 65 73 20 67 65 6f 70  clause uses geop
18b0: 6f 6c 79 5f 77 69 74 68 69 6e 28 29 20 61 73 20  oly_within() as 
18c0: 61 20 62 6f 6f 6c 65 61 6e 20 66 75 6e 63 74 69  a boolean functi
18d0: 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 67 65  on.  Only the.ge
18e0: 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28 50 31 2c  opoly_within(P1,
18f0: 50 32 29 20 61 6e 64 20 67 65 6f 70 6f 6c 79 5f  P2) and geopoly_
1900: 6f 76 65 72 6c 61 70 28 50 31 2c 50 32 29 20 66  overlap(P1,P2) f
1910: 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68  unctions have th
1920: 69 73 0a 63 61 70 61 62 69 6c 69 74 79 2e 0a 0a  is.capability...
1930: 3c 68 32 3e 54 68 65 20 67 65 6f 70 6f 6c 79 5f  <h2>The geopoly_
1940: 61 72 65 61 28 50 29 20 46 75 6e 63 74 69 6f 6e  area(P) Function
1950: 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 49 66 20 50 20  </h2>..<p>.If P 
1960: 69 73 20 61 20 70 6f 6c 79 67 6f 6e 2c 20 74 68  is a polygon, th
1970: 65 6e 20 67 65 6f 70 6f 6c 79 5f 61 72 65 61 28  en geopoly_area(
1980: 50 29 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  P) returns the a
1990: 72 65 61 20 65 6e 63 6c 6f 73 65 64 20 62 79 0a  rea enclosed by.
19a0: 74 68 61 74 20 70 6f 6c 79 67 6f 6e 2e 20 20 49  that polygon.  I
19b0: 66 20 50 20 69 73 20 6e 6f 74 20 61 20 70 6f 6c  f P is not a pol
19c0: 79 67 6f 6e 2c 20 67 65 6f 70 6f 6c 79 5f 61 72  ygon, geopoly_ar
19d0: 65 61 28 50 29 20 72 65 74 75 72 6e 73 20 4e 55  ea(P) returns NU
19e0: 4c 4c 2e 0a 0a 3c 68 32 3e 54 68 65 20 67 65 6f  LL...<h2>The geo
19f0: 70 6f 6c 79 5f 62 6c 6f 62 28 50 29 20 46 75 6e  poly_blob(P) Fun
1a00: 63 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  ction</h2>..<p>.
1a10: 49 66 20 50 20 69 73 20 61 20 70 6f 6c 79 67 6f  If P is a polygo
1a20: 6e 2c 20 74 68 65 6e 20 67 65 6f 70 6f 6c 79 5f  n, then geopoly_
1a30: 62 6c 6f 62 28 50 29 20 72 65 74 75 72 6e 73 20  blob(P) returns 
1a40: 74 68 65 20 62 69 6e 61 72 79 20 65 6e 63 6f 64  the binary encod
1a50: 69 6e 67 0a 6f 66 20 74 68 61 74 20 70 6f 6c 79  ing.of that poly
1a60: 67 6f 6e 20 61 73 20 61 20 42 4c 4f 42 2e 0a 49  gon as a BLOB..I
1a70: 66 20 50 20 69 73 20 6e 6f 74 20 61 20 70 6f 6c  f P is not a pol
1a80: 79 67 6f 6e 2c 20 67 65 6f 70 6f 6c 79 5f 62 6c  ygon, geopoly_bl
1a90: 6f 62 28 50 29 20 72 65 74 75 72 6e 73 20 4e 55  ob(P) returns NU
1aa0: 4c 4c 2e 0a 0a 3c 68 32 3e 54 68 65 20 67 65 6f  LL...<h2>The geo
1ab0: 70 6f 6c 79 5f 6a 73 6f 6e 28 50 29 20 46 75 6e  poly_json(P) Fun
1ac0: 63 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  ction</h2>..<p>.
1ad0: 49 66 20 50 20 69 73 20 61 20 70 6f 6c 79 67 6f  If P is a polygo
1ae0: 6e 2c 20 74 68 65 6e 20 67 65 6f 70 6f 6c 79 5f  n, then geopoly_
1af0: 6a 73 6f 6e 28 50 29 20 72 65 74 75 72 6e 73 20  json(P) returns 
1b00: 74 68 65 20 47 65 6f 4a 53 4f 4e 20 72 65 70 72  the GeoJSON repr
1b10: 65 73 65 6e 74 61 74 69 6f 6e 0a 6f 66 20 74 68  esentation.of th
1b20: 61 74 20 70 6f 6c 79 67 6f 6e 20 61 73 20 61 20  at polygon as a 
1b30: 54 45 50 54 20 73 74 72 69 6e 67 2e 0a 49 66 20  TEPT string..If 
1b40: 50 20 69 73 20 6e 6f 74 20 61 20 70 6f 6c 79 67  P is not a polyg
1b50: 6f 6e 2c 20 67 65 6f 70 6f 6c 79 5f 6a 73 6f 6e  on, geopoly_json
1b60: 28 50 29 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  (P) returns NULL
1b70: 2e 0a 0a 3c 68 32 3e 54 68 65 20 67 65 6f 70 6f  ...<h2>The geopo
1b80: 6c 79 5f 73 76 67 28 50 2c 2e 2e 2e 29 20 46 75  ly_svg(P,...) Fu
1b90: 6e 63 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e  nction</h2>..<p>
1ba0: 0a 49 66 20 50 20 69 73 20 61 20 70 6f 6c 79 67  .If P is a polyg
1bb0: 6f 6e 2c 20 74 68 65 6e 20 67 65 6f 70 6f 6c 79  on, then geopoly
1bc0: 5f 73 76 67 28 50 2c 2e 2e 2e 29 20 72 65 74 75  _svg(P,...) retu
1bd0: 72 6e 73 20 61 20 74 65 78 74 20 73 74 72 69 6e  rns a text strin
1be0: 67 20 77 68 69 63 68 20 69 73 20 61 0a 5b 68 74  g which is a.[ht
1bf0: 74 70 73 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64  tps://en.wikiped
1c00: 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 53 63 61 6c  ia.org/wiki/Scal
1c10: 61 62 6c 65 5f 56 65 63 74 6f 72 5f 47 72 61 70  able_Vector_Grap
1c20: 68 69 63 73 7c 53 63 61 6c 61 62 6c 65 20 56 65  hics|Scalable Ve
1c30: 63 74 6f 72 20 47 72 61 70 68 69 63 73 20 28 53  ctor Graphics (S
1c40: 56 47 29 5d 0a 72 65 70 72 65 73 65 6e 74 61 74  VG)].representat
1c50: 69 6f 6e 20 6f 66 20 74 68 61 74 20 70 6f 6c 79  ion of that poly
1c60: 67 6f 6e 2e 20 20 49 66 20 74 68 65 72 65 20 69  gon.  If there i
1c70: 73 20 6d 6f 72 65 20 6f 6e 65 20 61 72 67 75 6d  s more one argum
1c80: 65 6e 74 2c 20 74 68 65 6e 20 73 65 63 6f 6e 64  ent, then second
1c90: 0a 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20  .and subsequent 
1ca0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 64  arguments are ad
1cb0: 64 65 64 20 61 73 20 61 74 74 72 69 62 75 74 65  ded as attribute
1cc0: 73 20 74 6f 20 65 61 63 68 20 53 56 47 20 67 6c  s to each SVG gl
1cd0: 79 70 68 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  yph.  For exampl
1ce0: 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  e:..<codeblock>.
1cf0: 53 45 4c 45 43 54 20 67 65 6f 70 6f 6c 79 5f 73  SELECT geopoly_s
1d00: 76 67 28 24 70 6f 6c 79 67 6f 6e 2c 27 63 6c 61  vg($polygon,'cla
1d10: 73 73 3d 22 70 6f 6c 79 22 27 2c 27 73 74 79 6c  ss="poly"','styl
1d20: 65 3d 22 66 69 6c 6c 3a 62 6c 75 65 3b 22 27 29  e="fill:blue;"')
1d30: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
1d40: 3c 70 3e 0a 49 66 20 50 20 69 73 20 6e 6f 74 20  <p>.If P is not 
1d50: 61 20 70 6f 6c 79 67 6f 6e 2c 20 67 65 6f 70 6f  a polygon, geopo
1d60: 6c 79 5f 73 76 67 28 50 2c 2e 2e 2e 29 20 72 65  ly_svg(P,...) re
1d70: 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 0a 3c 70 3e  turns NULL...<p>
1d80: 0a 4e 6f 74 65 20 74 68 61 74 20 67 65 6f 70 6f  .Note that geopo
1d90: 6c 79 20 75 73 65 73 20 61 20 74 72 61 64 69 74  ly uses a tradit
1da0: 69 6f 6e 61 6c 20 72 69 67 68 74 2d 68 61 6e 64  ional right-hand
1db0: 65 64 20 63 61 72 74 65 73 69 61 6e 20 63 6f 6f  ed cartesian coo
1dc0: 72 64 69 6e 61 74 65 20 73 79 73 74 65 6d 0a 77  rdinate system.w
1dd0: 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 20 61  ith the origin a
1de0: 74 20 74 68 65 20 6c 6f 77 65 72 20 6c 65 66 74  t the lower left
1df0: 2c 20 77 68 65 72 65 61 73 20 53 56 47 20 75 73  , whereas SVG us
1e00: 65 73 20 61 20 6c 65 66 74 2d 68 61 6e 64 65 64  es a left-handed
1e10: 20 63 6f 6f 72 64 69 6e 61 74 65 0a 73 79 73 74   coordinate.syst
1e20: 65 6d 20 77 69 74 68 20 74 68 65 20 6f 72 69 67  em with the orig
1e30: 69 6e 20 61 74 20 74 68 65 20 75 70 70 65 72 20  in at the upper 
1e40: 6c 65 66 74 2e 20 20 54 68 65 20 67 65 6f 70 6f  left.  The geopo
1e50: 6c 79 5f 73 76 67 28 29 20 72 6f 75 74 69 6e 65  ly_svg() routine
1e60: 20 6d 61 6b 65 73 20 6e 6f 0a 61 74 74 65 6d 70   makes no.attemp
1e70: 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 74  t to transform t
1e80: 68 65 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 79  he coordinate sy
1e90: 73 74 65 6d 2c 20 73 6f 20 74 68 65 20 64 69 73  stem, so the dis
1ea0: 70 6c 61 79 65 64 20 69 6d 61 67 65 73 20 61 72  played images ar
1eb0: 65 20 73 68 6f 77 6e 0a 69 6e 20 6d 69 72 72 6f  e shown.in mirro
1ec0: 72 20 69 6d 61 67 65 20 61 6e 64 20 72 6f 74 61  r image and rota
1ed0: 74 65 64 2e 20 20 49 66 20 74 68 61 74 20 69 73  ted.  If that is
1ee0: 20 75 6e 64 65 73 69 72 61 62 6c 65 2c 20 74 68   undesirable, th
1ef0: 65 20 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d 28  e geopoly_xform(
1f00: 29 20 72 6f 75 74 69 6e 65 0a 63 61 6e 20 62 65  ) routine.can be
1f10: 20 75 73 65 64 20 74 6f 20 74 72 61 6e 73 66 6f   used to transfo
1f20: 72 6d 20 74 68 65 20 6f 75 74 70 75 74 20 66 72  rm the output fr
1f30: 6f 6d 20 63 61 72 74 65 73 69 61 6e 20 74 6f 20  om cartesian to 
1f40: 53 56 47 20 63 6f 6f 72 64 69 6e 61 74 65 73 20  SVG coordinates 
1f50: 70 72 69 6f 72 20 74 6f 0a 70 61 73 73 69 6e 67  prior to.passing
1f60: 20 74 68 65 20 70 6f 6c 79 67 6f 6e 73 20 69 6e   the polygons in
1f70: 74 6f 20 67 65 6f 70 6f 6c 79 5f 73 76 67 28 29  to geopoly_svg()
1f80: 2e 0a 0a 3c 68 32 3e 54 68 65 20 67 65 6f 70 6f  ...<h2>The geopo
1f90: 6c 79 5f 62 62 6f 78 28 50 29 20 46 75 6e 63 74  ly_bbox(P) Funct
1fa0: 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 49 66  ion</h2>..<p>.If
1fb0: 20 50 20 69 73 20 61 20 70 6f 6c 79 67 6f 6e 2c   P is a polygon,
1fc0: 20 74 68 65 6e 20 67 65 6f 70 6f 6c 79 5f 62 62   then geopoly_bb
1fd0: 6f 78 28 50 29 20 72 65 74 75 72 6e 73 20 74 68  ox(P) returns th
1fe0: 65 20 61 20 6e 65 77 20 70 6f 6c 79 67 6f 6e 20  e a new polygon 
1ff0: 74 68 61 74 20 69 73 0a 74 68 65 20 73 6d 61 6c  that is.the smal
2000: 6c 65 73 74 20 72 65 63 74 61 6e 67 6c 65 20 63  lest rectangle c
2010: 6f 6d 70 6c 65 74 65 6c 79 20 65 6e 63 6c 6f 73  ompletely enclos
2020: 69 6e 67 20 50 2e 0a 49 66 20 50 20 69 73 20 6e  ing P..If P is n
2030: 6f 74 20 61 20 70 6f 6c 79 67 6f 6e 2c 20 67 65  ot a polygon, ge
2040: 6f 70 6f 6c 79 5f 62 62 6f 78 28 50 29 20 72 65  opoly_bbox(P) re
2050: 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 0a 3c 68 32  turns NULL...<h2
2060: 3e 54 68 65 20 67 65 6f 70 6f 6c 79 5f 63 6f 6e  >The geopoly_con
2070: 74 61 69 6e 73 5f 70 6f 69 6e 74 28 50 2c 58 2c  tains_point(P,X,
2080: 59 29 20 46 75 6e 63 74 69 6f 6e 3c 2f 68 32 3e  Y) Function</h2>
2090: 0a 0a 3c 70 3e 0a 49 66 20 50 20 69 73 20 61 20  ..<p>.If P is a 
20a0: 70 6f 6c 79 67 6f 6e 2c 20 74 68 65 6e 20 67 65  polygon, then ge
20b0: 6f 70 6f 6c 79 5f 63 6f 6e 74 61 69 6e 73 5f 70  opoly_contains_p
20c0: 6f 69 6e 74 28 50 2c 58 2c 59 29 20 72 65 74 75  oint(P,X,Y) retu
20d0: 72 6e 73 20 74 72 75 65 20 69 66 20 61 6e 64 20  rns true if and 
20e0: 6f 6e 6c 79 0a 69 66 20 74 68 65 20 63 6f 6f 72  only.if the coor
20f0: 64 69 6e 61 74 65 20 58 2c 59 20 69 73 20 69 6e  dinate X,Y is in
2100: 73 69 64 65 20 6f 72 20 6f 6e 20 74 68 65 20 62  side or on the b
2110: 6f 75 6e 64 61 72 79 20 6f 66 20 74 68 65 20 70  oundary of the p
2120: 6f 6c 79 67 6f 6e 20 50 2e 0a 49 66 20 50 20 69  olygon P..If P i
2130: 73 20 6e 6f 74 20 61 20 70 6f 6c 79 67 6f 6e 2c  s not a polygon,
2140: 20 67 65 6f 70 6f 6c 79 5f 63 6f 6e 74 61 69 6e   geopoly_contain
2150: 73 5f 70 6f 69 6e 74 28 50 2c 58 2c 59 29 20 72  s_point(P,X,Y) r
2160: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 0a 3c 68  eturns NULL...<h
2170: 32 3e 54 68 65 20 67 65 6f 70 6f 6c 79 5f 78 66  2>The geopoly_xf
2180: 6f 72 6d 28 50 2c 41 2c 42 2c 43 2c 44 2c 45 2c  orm(P,A,B,C,D,E,
2190: 46 29 20 46 75 6e 63 74 69 6f 6e 3c 2f 68 32 3e  F) Function</h2>
21a0: 0a 0a 3c 70 3e 0a 54 68 65 20 67 65 6f 70 6f 6c  ..<p>.The geopol
21b0: 79 5f 78 66 6f 72 6d 28 50 2c 41 2c 42 2c 43 2c  y_xform(P,A,B,C,
21c0: 44 2c 45 2c 46 29 20 72 65 74 75 72 6e 73 20 61  D,E,F) returns a
21d0: 20 6e 65 77 20 70 6f 6c 79 67 6f 6e 20 74 68 61   new polygon tha
21e0: 74 20 69 73 20 61 0a 6c 69 6e 65 61 72 20 74 72  t is a.linear tr
21f0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 66 20  ansformation of 
2200: 74 68 65 20 70 6f 6c 79 67 6f 6e 20 50 20 61 6e  the polygon P an
2210: 64 20 77 68 65 72 65 20 74 68 65 20 74 72 61 6e  d where the tran
2220: 73 66 6f 72 6d 61 74 69 6f 6e 0a 69 73 20 64 65  sformation.is de
2230: 66 69 6e 65 64 20 62 79 20 76 61 6c 75 65 73 20  fined by values 
2240: 41 2c 42 2c 43 2c 44 2c 45 2c 46 2e 20 49 66 20  A,B,C,D,E,F. If 
2250: 50 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  P is not a valid
2260: 20 70 6f 6c 79 67 6f 6e 2c 20 74 68 69 73 0a 72   polygon, this.r
2270: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
2280: 55 4c 4c 2e 0a 0a 3c 70 3e 0a 54 68 65 20 74 72  ULL...<p>.The tr
2290: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 6e  ansformation con
22a0: 76 65 72 74 73 20 65 61 63 68 20 76 65 72 74 65  verts each verte
22b0: 78 20 6f 66 20 74 68 65 20 70 6f 6c 79 67 6f 6e  x of the polygon
22c0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
22d0: 65 0a 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e.following form
22e0: 75 6c 61 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ula:..<codeblock
22f0: 3e 0a 78 31 20 3d 20 41 2a 78 30 20 2b 20 42 2a  >.x1 = A*x0 + B*
2300: 79 30 20 2b 20 45 0a 79 31 20 3d 20 43 2a 78 30  y0 + E.y1 = C*x0
2310: 20 2b 20 44 2a 79 30 20 2b 20 46 0a 3c 2f 63 6f   + D*y0 + F.</co
2320: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 53 6f  deblock>..<p>.So
2330: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
2340: 6f 20 6d 6f 76 65 20 61 20 70 6f 6c 79 67 6f 6e  o move a polygon
2350: 20 62 79 20 73 6f 6d 65 20 61 6d 6f 75 6e 74 20   by some amount 
2360: 44 58 2c 20 44 59 20 77 69 74 68 6f 75 74 20 63  DX, DY without c
2370: 68 61 6e 67 69 6e 67 0a 69 74 73 20 73 68 61 70  hanging.its shap
2380: 65 2c 20 75 73 65 3a 0a 0a 3c 63 6f 64 65 62 6c  e, use:..<codebl
2390: 6f 63 6b 3e 0a 67 65 6f 70 6f 6c 79 5f 78 66 6f  ock>.geopoly_xfo
23a0: 72 6d 28 24 70 6f 6c 79 67 6f 6e 2c 20 31 2c 20  rm($polygon, 1, 
23b0: 30 2c 20 30 2c 20 31 2c 20 24 44 58 2c 20 24 44  0, 0, 1, $DX, $D
23c0: 59 29 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  Y).</codeblock>.
23d0: 0a 3c 70 3e 0a 54 6f 20 72 6f 74 61 74 65 20 61  .<p>.To rotate a
23e0: 20 70 6f 6c 79 67 6f 6e 20 62 79 20 52 20 72 61   polygon by R ra
23f0: 64 69 61 6e 73 20 61 72 6f 75 6e 64 20 74 68 65  dians around the
2400: 20 70 6f 69 6e 74 20 30 2c 20 30 3a 0a 0a 3c 63   point 0, 0:..<c
2410: 6f 64 65 62 6c 6f 63 6b 3e 0a 67 65 6f 70 6f 6c  odeblock>.geopol
2420: 79 5f 78 66 6f 72 6d 28 24 70 6f 6c 79 67 6f 6e  y_xform($polygon
2430: 2c 20 63 6f 73 28 24 52 29 2c 20 73 69 6e 28 24  , cos($R), sin($
2440: 52 29 2c 20 2d 73 69 6e 28 24 52 29 2c 20 63 6f  R), -sin($R), co
2450: 73 28 24 52 29 2c 20 30 2c 20 30 29 0a 3c 2f 63  s($R), 0, 0).</c
2460: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 31 3e 49  odeblock>..<h1>I
2470: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 44 65  mplementation De
2480: 74 61 69 6c 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 54  tails</h1>..<p>T
2490: 68 65 20 67 65 6f 70 6f 6c 79 20 6d 6f 64 75 6c  he geopoly modul
24a0: 65 20 69 73 20 61 6e 20 65 78 74 65 6e 73 69 6f  e is an extensio
24b0: 6e 20 74 6f 20 74 68 65 20 5b 52 2d 54 72 65 65  n to the [R-Tree
24c0: 20 65 78 74 65 6e 73 69 6f 6e 5d 2e 20 20 47 65   extension].  Ge
24d0: 6f 70 6f 6c 79 0a 75 73 65 73 20 74 68 65 20 73  opoly.uses the s
24e0: 61 6d 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6c  ame underlying l
24f0: 6f 67 69 63 20 61 6e 64 20 73 68 61 64 6f 77 20  ogic and shadow 
2500: 74 61 62 6c 65 73 20 61 73 20 74 68 65 20 5b 52  tables as the [R
2510: 2d 54 72 65 65 20 65 78 74 65 6e 73 69 6f 6e 5d  -Tree extension]
2520: 2e 0a 47 65 6f 70 6f 6c 79 20 6d 65 72 65 6c 79  ..Geopoly merely
2530: 20 70 72 65 73 65 6e 74 73 20 61 20 64 69 66 66   presents a diff
2540: 65 72 65 6e 74 20 69 6e 74 65 72 66 61 63 65 2c  erent interface,
2550: 20 61 6e 64 20 70 72 6f 76 69 64 65 73 20 73 6f   and provides so
2560: 6d 65 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 74  me extra logic.t
2570: 6f 20 63 6f 6d 70 75 74 65 20 70 6f 6c 79 67 6f  o compute polygo
2580: 6e 20 64 65 63 6f 64 69 6e 67 2c 20 6f 76 65 72  n decoding, over
2590: 6c 61 70 2c 20 61 6e 64 20 63 6f 6e 74 61 69 6e  lap, and contain
25a0: 6d 65 6e 74 2e 0a 0a 3c 68 32 3e 42 69 6e 61 72  ment...<h2>Binar
25b0: 79 20 45 6e 63 6f 64 69 6e 67 20 6f 66 20 50 6f  y Encoding of Po
25c0: 6c 79 67 6f 6e 73 3c 2f 68 32 3e 0a 0a 3c 70 3e  lygons</h2>..<p>
25d0: 0a 47 65 6f 70 6f 6c 79 20 73 74 6f 72 65 73 20  .Geopoly stores 
25e0: 61 6c 6c 20 70 6f 6c 79 67 6f 6e 73 20 69 6e 74  all polygons int
25f0: 65 72 6e 61 6c 6c 79 20 75 73 69 6e 67 20 61 20  ernally using a 
2600: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 2e 20 20  binary format.  
2610: 41 20 62 69 6e 61 72 79 0a 70 6f 6c 79 67 6f 6e  A binary.polygon
2620: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2630: 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 6f 6c  -byte header fol
2640: 6c 6f 77 69 6e 67 20 62 79 20 61 6e 20 61 72 72  lowing by an arr
2650: 61 79 20 63 6f 6f 72 64 69 6e 61 74 65 0a 70 61  ay coordinate.pa
2660: 69 72 73 20 77 68 69 63 68 20 65 61 63 68 20 64  irs which each d
2670: 69 6d 65 6e 73 69 6f 6e 20 6f 66 20 65 61 63 68  imension of each
2680: 20 63 6f 6f 72 64 69 6e 61 74 65 20 69 73 20 6f   coordinate is o
2690: 66 20 33 32 2d 62 79 74 65 20 66 6c 6f 61 74 69  f 32-byte floati
26a0: 6e 67 20 70 6f 69 6e 74 0a 6e 75 6d 62 65 72 2e  ng point.number.
26b0: 0a 0a 3c 70 3e 0a 54 68 65 20 66 69 72 73 74 20  ..<p>.The first 
26c0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
26d0: 65 72 20 69 73 20 61 20 66 6c 61 67 20 62 79 74  er is a flag byt
26e0: 65 2e 20 20 54 68 65 20 6c 65 61 73 74 20 73 69  e.  The least si
26f0: 67 6e 69 66 69 63 61 6e 74 20 62 69 74 0a 6f 66  gnificant bit.of
2700: 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 64   the flag byte d
2710: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
2720: 72 20 74 68 65 20 63 6f 6f 72 64 69 6e 61 74 65  r the coordinate
2730: 20 70 61 69 72 73 20 74 68 65 20 66 6f 6c 6c 6f   pairs the follo
2740: 77 20 74 68 65 0a 68 65 61 64 65 72 20 61 72 65  w the.header are
2750: 20 73 74 6f 72 65 64 20 62 69 67 2d 65 6e 64 69   stored big-endi
2760: 61 6e 20 6f 72 20 6c 69 74 74 6c 65 2d 65 6e 64  an or little-end
2770: 69 61 6e 2e 20 20 41 20 76 61 6c 75 65 20 6f 66  ian.  A value of
2780: 20 30 20 66 6f 72 20 74 68 65 20 6c 65 61 73 74   0 for the least
2790: 0a 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74  .significant bit
27a0: 20 6d 65 61 6e 73 20 62 69 67 2d 65 6e 64 69 61   means big-endia
27b0: 6e 20 61 6e 64 20 61 20 76 61 6c 75 65 20 6f 66  n and a value of
27c0: 20 31 20 6d 65 61 6e 73 20 6c 69 74 74 6c 65 20   1 means little 
27d0: 65 6e 64 69 61 6e 2e 0a 4f 74 68 65 72 20 62 69  endian..Other bi
27e0: 74 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ts of the first 
27f0: 62 79 74 65 20 69 6e 20 74 68 65 20 68 65 61 64  byte in the head
2800: 65 72 20 61 72 65 20 72 65 73 65 72 76 65 64 20  er are reserved 
2810: 66 6f 72 20 66 75 74 75 72 65 20 65 78 70 61 6e  for future expan
2820: 73 69 6f 6e 2e 0a 0a 3c 70 3e 0a 54 68 65 20 6e  sion...<p>.The n
2830: 65 78 74 20 74 68 72 65 65 20 62 79 74 65 73 20  ext three bytes 
2840: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 72 65  in the header re
2850: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
2860: 6f 66 20 76 65 72 74 65 78 65 73 20 69 6e 20 74  of vertexes in t
2870: 68 65 20 70 6f 6c 79 67 6f 6e 0a 61 73 20 61 20  he polygon.as a 
2880: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2890: 65 72 2e 20 20 54 68 75 73 20 74 68 65 72 65 20  er.  Thus there 
28a0: 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  is an upper boun
28b0: 64 20 6f 66 20 61 62 6f 75 74 20 31 36 20 6d 69  d of about 16 mi
28c0: 6c 6c 69 6f 6e 0a 76 65 72 74 65 78 65 73 20 70  llion.vertexes p
28d0: 65 72 20 70 6f 6c 79 67 6f 6e 2e 0a 0a 3c 70 3e  er polygon...<p>
28e0: 0a 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 68  .Following the h
28f0: 65 61 64 65 72 20 69 73 20 74 68 65 20 61 72 72  eader is the arr
2900: 61 79 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65  ay of coordinate
2910: 20 70 61 69 72 73 2e 20 20 45 61 63 68 20 63 6f   pairs.  Each co
2920: 6f 72 64 69 6e 61 74 65 20 69 73 0a 61 20 33 32  ordinate is.a 32
2930: 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
2940: 69 6e 74 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  int number.  The
2950: 20 75 73 65 20 6f 66 20 33 32 2d 62 69 74 20 66   use of 32-bit f
2960: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
2970: 6c 75 65 73 20 66 6f 72 0a 63 6f 6f 72 64 69 6e  lues for.coordin
2980: 61 74 65 73 20 6d 65 61 6e 73 20 74 68 61 74 20  ates means that 
2990: 61 6e 79 20 70 6f 69 6e 74 20 6f 6e 20 74 68 65  any point on the
29a0: 20 65 61 72 74 68 27 73 20 73 75 72 66 61 63 65   earth's surface
29b0: 20 63 61 6e 20 62 65 20 6d 61 70 70 65 64 20 77   can be mapped w
29c0: 69 74 68 0a 61 20 72 65 73 6f 6c 75 74 69 6f 6e  ith.a resolution
29d0: 20 6f 66 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   of approximatel
29e0: 79 20 32 2e 35 20 6d 65 74 65 72 73 2e 20 20 48  y 2.5 meters.  H
29f0: 69 67 68 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  igher resolution
2a00: 73 20 61 72 65 20 6f 66 20 63 6f 75 72 73 65 0a  s are of course.
2a10: 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
2a20: 6d 61 70 20 69 73 20 72 65 73 74 72 69 63 74 65  map is restricte
2a30: 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 6f  d to a single co
2a40: 6e 74 69 6e 65 6e 74 20 6f 72 20 63 6f 75 6e 74  ntinent or count
2a50: 72 79 2e 0a 4e 6f 74 65 20 74 68 61 74 20 74 68  ry..Note that th
2a60: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 66 20  e resolution of 
2a70: 63 6f 6f 72 64 69 6e 61 74 65 73 20 69 6e 20 74  coordinates in t
2a80: 68 65 20 67 65 6f 70 6f 6c 79 20 6d 6f 64 75 6c  he geopoly modul
2a90: 65 20 69 73 20 73 69 6d 69 6c 61 72 0a 69 6e 20  e is similar.in 
2aa0: 6d 61 67 6e 69 74 75 64 65 20 74 6f 20 64 61 69  magnitude to dai
2ab0: 6c 79 20 6d 6f 76 65 6d 65 6e 74 20 6f 66 20 70  ly movement of p
2ac0: 6f 69 6e 74 73 20 6f 6e 20 74 68 65 20 65 61 72  oints on the ear
2ad0: 74 68 27 73 20 73 75 72 66 61 63 65 20 64 75 65  th's surface due
2ae0: 20 74 6f 0a 74 69 64 61 6c 20 66 6f 72 63 65 73   to.tidal forces
2af0: 2e 0a 0a 3c 70 3e 0a 54 68 65 20 6c 69 73 74 20  ...<p>.The list 
2b00: 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 69  of coordinates i
2b10: 6e 20 74 68 65 20 62 69 6e 61 72 79 20 66 6f 72  n the binary for
2b20: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  mat contains no 
2b30: 72 65 64 75 6e 64 61 6e 63 79 2e 20 20 0a 54 68  redundancy.  .Th
2b40: 65 20 6c 61 73 74 20 63 6f 6f 72 64 69 6e 61 74  e last coordinat
2b50: 65 20 69 73 20 6e 6f 74 20 61 20 72 65 70 65 61  e is not a repea
2b60: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  t of the first a
2b70: 73 20 69 74 20 69 73 20 77 69 74 68 20 47 65 6f  s it is with Geo
2b80: 4a 53 4f 4e 2e 20 20 0a 48 65 6e 63 65 2c 20 74  JSON.  .Hence, t
2b90: 68 65 72 65 20 69 73 20 61 6c 77 61 79 73 20 6f  here is always o
2ba0: 6e 65 20 66 65 77 65 72 20 63 6f 6f 72 64 69 6e  ne fewer coordin
2bb0: 61 74 65 20 70 61 69 72 20 69 6e 20 74 68 65 20  ate pair in the 
2bc0: 62 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74  binary represent
2bd0: 61 74 69 6f 6e 20 6f 66 0a 61 20 70 6f 6c 79 67  ation of.a polyg
2be0: 6f 6e 20 63 6f 6d 70 61 72 65 64 20 74 6f 20 74  on compared to t
2bf0: 68 65 20 47 65 6f 4a 53 4f 4e 20 72 65 70 72 65  he GeoJSON repre
2c00: 73 65 6e 74 61 74 69 6f 6e 2e 0a 0a 3c 68 32 3e  sentation...<h2>
2c10: 53 68 61 64 6f 77 20 54 61 62 6c 65 73 3c 2f 68  Shadow Tables</h
2c20: 32 3e 0a 0a 3c 70 3e 0a 54 68 65 20 67 65 6f 70  2>..<p>.The geop
2c30: 6f 6c 79 20 6d 6f 64 75 6c 65 20 69 73 20 62 75  oly module is bu
2c40: 69 6c 74 20 6f 6e 20 74 6f 70 20 6f 66 20 74 68  ilt on top of th
2c50: 65 20 5b 52 2d 54 72 65 65 20 65 78 74 65 6e 73  e [R-Tree extens
2c60: 69 6f 6e 5d 20 61 6e 64 20 75 73 65 73 20 74 68  ion] and uses th
2c70: 65 0a 73 61 6d 65 20 75 6e 64 65 72 6c 79 69 6e  e.same underlyin
2c80: 67 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 20  g shadow tables 
2c90: 61 6e 64 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  and algorithms. 
2ca0: 20 46 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 75   For indexing pu
2cb0: 72 70 6f 73 65 73 2c 20 65 61 63 68 0a 70 6f 6c  rposes, each.pol
2cc0: 79 67 6f 6e 20 69 73 20 72 65 70 72 65 73 65 6e  ygon is represen
2cd0: 74 65 64 20 69 6e 20 74 68 65 20 73 68 61 64 6f  ted in the shado
2ce0: 77 20 74 61 62 6c 65 73 20 61 73 20 61 20 72 65  w tables as a re
2cf0: 63 74 61 6e 67 75 6c 61 72 20 62 6f 75 6e 64 69  ctangular boundi
2d00: 6e 67 20 62 6f 78 2e 0a 54 68 65 20 75 6e 64 65  ng box..The unde
2d10: 72 6c 79 69 6e 67 20 52 2d 54 72 65 65 20 69 6d  rlying R-Tree im
2d20: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
2d30: 73 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 65 73  s bounding boxes
2d40: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 73 65   to limit the se
2d50: 61 72 63 68 0a 73 70 61 63 65 2e 20 20 54 68 65  arch.space.  The
2d60: 6e 20 74 68 65 20 67 65 6f 70 6c 6f 79 5f 6f 76  n the geoploy_ov
2d70: 65 72 6c 61 70 28 29 20 61 6e 64 2f 6f 72 20 67  erlap() and/or g
2d80: 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28 29 20  eopoly_within() 
2d90: 72 6f 75 74 69 6e 65 73 20 66 75 72 74 68 65 72  routines further
2da0: 0a 72 65 66 69 6e 65 20 74 68 65 20 73 65 61 72  .refine the sear
2db0: 63 68 20 74 6f 20 74 68 65 20 65 78 61 63 74 20  ch to the exact 
2dc0: 61 6e 73 77 65 72 2e 0a                          answer..