Hex Artifact Content
Not logged in

Artifact a027126d7e8b7b78fa1b0d9dd1e7071278910314:

Wiki page [About ST_Subdivide()] by sandro 2019-02-24 17:26:15.
0000: 44 20 32 30 31 39 2d 30 32 2d 32 34 54 31 37 3a  D 2019-02-24T17:
0010: 32 36 3a 31 35 2e 33 35 33 0a 4c 20 41 62 6f 75  26:15.353.L Abou
0020: 74 5c 73 53 54 5f 53 75 62 64 69 76 69 64 65 28  t\sST_Subdivide(
0030: 29 0a 50 20 32 32 66 34 66 35 35 30 38 34 31 63  ).P 22f4f550841c
0040: 36 31 33 34 37 66 63 39 65 64 64 62 38 36 64 39  61347fc9eddb86d9
0050: 63 64 62 63 31 66 65 34 32 30 31 63 0a 55 20 73  cdbc1fe4201c.U s
0060: 61 6e 64 72 6f 0a 57 20 31 32 35 34 36 0a 3c 74  andro.W 12546.<t
0070: 61 62 6c 65 20 63 65 6c 6c 73 70 61 63 69 6e 67  able cellspacing
0080: 3d 22 31 32 22 20 77 69 64 74 68 3d 22 31 30 30  ="12" width="100
0090: 25 22 3e 0d 0a 3c 74 72 3e 3c 74 64 20 63 6f 6c  %">..<tr><td col
00a0: 73 70 61 6e 3d 22 32 22 3e 0d 0a 3c 74 61 62 6c  span="2">..<tabl
00b0: 65 20 77 69 64 74 68 3d 22 31 30 30 25 22 20 62  e width="100%" b
00c0: 67 63 6f 6c 6f 72 3d 22 23 66 30 66 30 66 38 22  gcolor="#f0f0f8"
00d0: 3e 0d 0a 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e  >..<tr><td align
00e0: 3d 22 63 65 6e 74 65 72 22 3e 0d 0a 3c 68 31 3e  ="center">..<h1>
00f0: 53 54 5f 53 75 62 64 69 76 69 64 65 28 29 3a 20  ST_Subdivide(): 
0100: 61 20 71 75 69 63 6b 20 69 6e 74 72 6f 3c 2f 68  a quick intro</h
0110: 31 3e 0d 0a 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f  1>..</td></tr></
0120: 74 61 62 6c 65 3e 0d 0a 3c 74 61 62 6c 65 20 77  table>..<table w
0130: 69 64 74 68 3d 22 31 30 30 25 22 3e 3c 74 72 3e  idth="100%"><tr>
0140: 0d 0a 3c 74 64 20 77 69 64 74 68 3d 22 33 33 25  ..<td width="33%
0150: 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e 3c  " align="left"><
0160: 2f 74 64 3e 0d 0a 3c 74 64 20 61 6c 69 67 6e 3d  /td>..<td align=
0170: 22 63 65 6e 74 65 72 22 3e 3c 61 20 68 72 65 66  "center"><a href
0180: 3d 22 68 74 74 70 73 3a 2f 2f 77 77 77 2e 67 61  ="https://www.ga
0190: 69 61 2d 67 69 73 2e 69 74 2f 66 6f 73 73 69 6c  ia-gis.it/fossil
01a0: 2f 6c 69 62 73 70 61 74 69 61 6c 69 74 65 2f 77  /libspatialite/w
01b0: 69 6b 69 3f 6e 61 6d 65 3d 34 2e 33 2e 30 2b 64  iki?name=4.3.0+d
01c0: 6f 63 22 3e 62 61 63 6b 20 74 6f 20 69 6e 64 65  oc">back to inde
01d0: 78 3c 2f 61 3e 3c 2f 74 64 3e 0d 0a 3c 74 64 20  x</a></td>..<td 
01e0: 77 69 64 74 68 3d 22 33 33 25 22 20 61 6c 69 67  width="33%" alig
01f0: 6e 3d 22 72 69 67 68 74 22 3e 3c 2f 74 64 3e 0d  n="right"></td>.
0200: 0a 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 3c 62  .</tr></table><b
0210: 72 3e 0d 0a 3c 68 32 3e 41 62 6f 75 74 20 53 54  r>..<h2>About ST
0220: 5f 53 75 62 64 69 76 69 64 65 28 29 3c 2f 68 32  _Subdivide()</h2
0230: 3e 0d 0a 53 74 61 72 74 69 6e 67 20 77 69 74 68  >..Starting with
0240: 20 76 65 72 73 69 6f 6e 20 3c 62 3e 35 2e 30 2e   version <b>5.0.
0250: 30 3c 2f 62 3e 20 53 70 61 74 69 61 4c 69 74 65  0</b> SpatiaLite
0260: 20 73 75 70 70 6f 72 74 73 20 3c 62 3e 53 54 5f   supports <b>ST_
0270: 53 75 62 64 69 76 69 64 65 28 29 3c 2f 62 3e 2c  Subdivide()</b>,
0280: 20 61 6e 20 61 64 76 61 6e 63 65 64 20 53 51 4c   an advanced SQL
0290: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64   function alread
02a0: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 3c  y available on <
02b0: 61 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f 2f  a href="https://
02c0: 70 6f 73 74 67 69 73 2e 6e 65 74 2f 64 6f 63 73  postgis.net/docs
02d0: 2f 53 54 5f 53 75 62 64 69 76 69 64 65 2e 68 74  /ST_Subdivide.ht
02e0: 6d 6c 22 3e 50 6f 73 74 47 49 53 3c 2f 61 3e 2e  ml">PostGIS</a>.
02f0: 3c 62 72 3e 0d 0a 54 68 65 20 69 6d 70 6c 65 6d  <br>..The implem
0300: 65 6e 74 61 74 69 6f 6e 20 69 73 20 76 65 72 79  entation is very
0310: 20 73 69 6d 69 6c 61 72 20 69 6e 20 62 6f 74 68   similar in both
0320: 20 53 70 61 74 69 61 6c 20 44 42 4d 53 65 73 20   Spatial DBMSes 
0330: 62 65 63 61 75 73 65 20 69 6e 20 50 6f 73 74 47  because in PostG
0340: 49 53 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  IS the function 
0350: 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20  is created with 
0360: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 3c 62 3e  the internal <b>
0370: 6c 77 67 65 6f 6d 3c 2f 62 3e 20 6c 69 62 72 61  lwgeom</b> libra
0380: 72 79 2c 20 61 6e 64 20 69 6e 20 53 70 61 74 69  ry, and in Spati
0390: 61 4c 69 74 65 20 77 69 74 68 20 3c 62 3e 6c 69  aLite with <b>li
03a0: 62 72 74 74 6f 70 6f 3c 2f 62 3e 2c 20 77 68 69  brttopo</b>, whi
03b0: 63 68 20 69 73 20 61 20 75 6e 69 76 65 72 73 61  ch is a universa
03c0: 6c 20 70 6f 72 74 69 6e 67 20 6f 66 20 6c 77 67  l porting of lwg
03d0: 65 6f 6d 20 77 69 74 68 6f 75 74 20 50 6f 73 74  eom without Post
03e0: 47 49 53 2e 3c 62 72 3e 3c 62 72 3e 0d 0a 41 20  GIS.<br><br>..A 
03f0: 73 68 6f 72 74 20 72 61 74 69 6f 6e 61 6c 65 3a  short rationale:
0400: 20 70 72 6f 63 65 73 73 69 6e 67 20 68 75 67 65   processing huge
0410: 20 67 65 6f 6d 65 74 72 69 65 73 20 68 61 76 69   geometries havi
0420: 6e 67 20 61 6e 20 69 6d 70 72 65 73 73 69 76 65  ng an impressive
0430: 20 6e 75 6d 62 65 72 20 6f 66 20 56 65 72 74 69   number of Verti
0440: 63 65 73 20 28 6d 61 6e 79 20 74 68 6f 75 73 61  ces (many thousa
0450: 6e 64 73 20 6f 72 20 65 76 65 6e 20 6d 6f 72 65  nds or even more
0460: 29 20 69 73 20 61 6e 20 65 78 74 72 65 6d 65 6c  ) is an extremel
0470: 79 20 73 6c 6f 77 20 70 72 6f 63 65 73 73 2e 3c  y slow process.<
0480: 62 72 3e 0d 0a 53 75 62 64 69 76 69 64 69 6e 67  br>..Subdividing
0490: 20 74 68 65 6d 20 69 6e 74 6f 20 6d 61 6e 79 20   them into many 
04a0: 73 6d 61 6c 6c 65 72 20 70 61 72 74 73 20 28 77  smaller parts (w
04b0: 68 69 6c 65 20 70 72 65 73 65 72 76 69 6e 67 20  hile preserving 
04c0: 66 75 6c 6c 20 74 6f 70 6f 6c 6f 67 69 63 61 6c  full topological
04d0: 20 63 6f 6e 73 69 73 74 65 6e 63 79 29 20 75 73   consistency) us
04e0: 75 61 6c 6c 79 20 72 65 73 75 6c 74 73 20 69 6e  ually results in
04f0: 20 61 20 73 61 74 69 73 66 79 69 6e 67 20 70 72   a satisfying pr
0500: 6f 63 65 73 73 69 6e 67 20 73 70 65 65 64 2e 0d  ocessing speed..
0510: 0a 54 68 69 73 20 69 73 20 65 78 61 63 74 6c 79  .This is exactly
0520: 20 74 68 65 20 69 6e 74 65 6e 64 65 64 20 73 63   the intended sc
0530: 6f 70 65 20 6f 66 20 3c 62 3e 53 54 5f 53 75 62  ope of <b>ST_Sub
0540: 64 69 76 69 64 65 28 29 3c 2f 62 3e 3a 0d 0a 3c  divide()</b>:..<
0550: 75 6c 3e 0d 0a 3c 6c 69 3e 74 68 69 73 20 66 75  ul>..<li>this fu
0560: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 63 65  nction will rece
0570: 69 76 65 20 61 6e 20 69 6e 70 75 74 20 67 65 6f  ive an input geo
0580: 6d 65 74 72 79 20 28 77 68 69 63 68 20 6d 61 79  metry (which may
0590: 20 76 65 72 79 20 77 65 6c 6c 20 62 65 20 65 78   very well be ex
05a0: 74 72 65 6d 65 6c 79 20 6c 61 72 67 65 29 2e 3c  tremely large).<
05b0: 2f 6c 69 3e 0d 0a 3c 6c 69 3e 65 61 63 68 20 3c  /li>..<li>each <
05c0: 62 3e 4c 69 6e 65 73 74 72 69 6e 67 3c 2f 62 3e  b>Linestring</b>
05d0: 20 6f 72 20 3c 62 3e 50 6f 6c 79 67 6f 6e 3c 2f   or <b>Polygon</
05e0: 62 3e 20 66 6f 75 6e 64 20 77 69 74 68 69 6e 20  b> found within 
05f0: 74 68 65 20 69 6e 70 75 74 20 67 65 6f 6d 65 74  the input geomet
0600: 72 79 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  ry will be proce
0610: 73 73 65 64 3a 0d 0a 3c 75 6c 3e 0d 0a 3c 6c 69  ssed:..<ul>..<li
0620: 3e 61 6c 6c 20 4c 69 6e 65 73 74 72 69 6e 67 73  >all Linestrings
0630: 20 6f 72 20 50 6f 6c 79 67 6f 6e 73 20 75 73 69   or Polygons usi
0640: 6e 67 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 56  ng a number of V
0650: 65 72 74 69 63 65 73 20 6c 65 73 73 65 72 20 6f  ertices lesser o
0660: 72 20 65 71 75 61 6c 20 74 68 61 6e 20 74 68 65  r equal than the
0670: 20 67 69 76 65 6e 20 74 68 72 65 73 68 6f 6c 64   given threshold
0680: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
0690: 64 20 61 73 20 74 68 65 79 20 61 72 65 2e 3c 2f  d as they are.</
06a0: 6c 69 3e 0d 0a 3c 6c 69 3e 65 76 65 72 79 74 68  li>..<li>everyth
06b0: 69 6e 67 20 65 6c 73 65 20 77 69 6c 6c 20 62 65  ing else will be
06c0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 73 70 6c   recursively spl
06d0: 69 74 2c 20 75 6e 74 69 6c 20 61 20 3c 62 3e 63  it, until a <b>c
06e0: 6f 6c 6c 65 63 74 69 6f 6e 3c 2f 62 3e 20 6f 66  ollection</b> of
06f0: 20 65 6c 65 6d 65 6e 74 61 72 79 20 70 61 72 74   elementary part
0700: 73 20 65 78 69 73 74 73 2c 20 75 73 69 6e 67 20  s exists, using 
0710: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  no more than the
0720: 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72   required number
0730: 20 6f 66 20 76 65 72 74 69 63 65 73 2e 3c 2f 6c   of vertices.</l
0740: 69 3e 0d 0a 3c 2f 75 6c 3e 3c 2f 6c 69 3e 0d 0a  i>..</ul></li>..
0750: 3c 6c 69 3e 77 68 65 6e 20 63 6f 6d 70 6c 65 61  <li>when complea
0760: 74 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  ted, the functio
0770: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 6f 6e  n will return on
0780: 65 20 67 65 6f 6d 65 74 72 79 20 61 73 20 61 20  e geometry as a 
0790: 63 6f 6c 6c 65 63 74 69 6f 6e 20 63 6f 6e 74 61  collection conta
07a0: 69 6e 69 6e 67 20 61 6c 6c 20 6f 66 20 74 68 65  ining all of the
07b0: 20 65 6c 65 6d 65 6e 74 61 72 79 20 70 61 72 74   elementary part
07c0: 73 20 28 61 20 3c 62 3e 4d 75 6c 74 69 4c 69 6e  s (a <b>MultiLin
07d0: 65 73 74 72 69 6e 67 3c 2f 62 3e 20 6f 72 20 61  estring</b> or a
07e0: 20 3c 62 3e 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e   <b>MultiPolygon
07f0: 3c 2f 62 3e 20 64 65 70 65 6e 64 69 6e 67 20 6f  </b> depending o
0800: 6e 20 74 68 65 20 6e 61 74 75 72 65 20 6f 66 20  n the nature of 
0810: 74 68 65 20 69 6e 70 75 74 20 67 65 6f 6d 65 74  the input geomet
0820: 72 79 29 2e 3c 2f 6c 69 3e 0d 0a 3c 2f 75 6c 3e  ry).</li>..</ul>
0830: 0d 0a 3c 68 32 3e 42 61 73 69 63 20 53 61 6d 70  ..<h2>Basic Samp
0840: 6c 65 73 3c 2f 68 32 3e 0d 0a 54 68 65 20 66 6f  les</h2>..The fo
0850: 6c 6c 6f 77 69 6e 67 20 73 61 6d 70 6c 65 73 73  llowing sampless
0860: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 68   are based on th
0870: 65 2c 20 66 72 65 65 6c 79 20 61 76 61 69 6c 61  e, freely availa
0880: 62 6c 65 2c 20 3c 62 3e 61 6d 5f 72 65 67 5f 6d  ble, <b>am_reg_m
0890: 75 6c 74 69 70 61 72 74 3c 2f 62 3e 20 53 68 61  ultipart</b> Sha
08a0: 70 65 66 69 6c 65 20 61 6e 64 20 63 61 6e 20 62  pefile and can b
08b0: 65 20 64 6f 77 6e 6c 6f 61 64 20 66 72 6f 6d 20  e download from 
08c0: 68 65 72 65 20 20 3c 61 20 68 72 65 66 3d 22 68  here  <a href="h
08d0: 74 74 70 3a 2f 2f 77 77 77 35 30 32 2e 72 65 67  ttp://www502.reg
08e0: 69 6f 6e 65 2e 74 6f 73 63 61 6e 61 2e 69 74 2f  ione.toscana.it/
08f0: 67 65 6f 73 63 6f 70 69 6f 2f 63 61 72 74 6f 74  geoscopio/cartot
0900: 65 63 61 2e 68 74 6d 6c 22 3e 68 65 72 65 3c 2f  eca.html">here</
0910: 61 3e 20 28 73 65 61 72 63 68 20 66 6f 72 20 3c  a> (search for <
0920: 62 3e 41 6d 62 69 74 69 20 41 6d 6d 69 6e 69 73  b>Ambiti Amminis
0930: 74 72 61 74 69 76 69 3c 2f 62 3e 20 2d 20 3c 69  trativi</b> - <i
0940: 3e 41 64 6d 69 6e 69 73 74 72 61 74 69 76 65 20  >Administrative 
0950: 42 6f 75 6e 64 61 72 69 65 73 3c 2f 69 3e 29 2e  Boundaries</i>).
0960: 3c 62 72 3e 3c 62 72 3e 0d 0a 54 68 69 73 20 53  <br><br>..This S
0970: 68 61 70 65 66 69 6c 65 20 73 75 70 70 6f 72 74  hapefile support
0980: 73 20 61 20 76 65 72 79 20 61 63 63 75 72 61 74  s a very accurat
0990: 65 20 61 6e 64 20 70 72 65 63 69 73 65 20 6d 61  e and precise ma
09a0: 70 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  p representation
09b0: 2c 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 65  , and the main e
09c0: 78 74 65 72 69 6f 72 20 72 69 6e 67 20 68 61 73  xterior ring has
09d0: 20 6d 6f 72 65 20 74 68 61 6e 20 31 30 30 2c 30   more than 100,0
09e0: 30 30 2b 20 56 65 72 74 69 63 65 73 2e 3c 62 72  00+ Vertices.<br
09f0: 3e 0d 0a 49 74 27 73 20 61 20 76 65 72 79 20 67  >..It's a very g
0a00: 6f 6f 64 20 65 78 61 6d 70 6c 65 20 6f 66 20 61  ood example of a
0a10: 20 47 65 6f 6d 65 74 72 79 2c 20 74 68 61 74 20   Geometry, that 
0a20: 69 73 20 73 6f 20 68 75 67 65 20 61 6e 64 20 77  is so huge and w
0a30: 69 6c 6c 20 63 61 75 73 65 20 61 6e 79 20 53 70  ill cause any Sp
0a40: 61 74 69 61 6c 20 6f 70 65 72 61 74 6f 72 2c 20  atial operator, 
0a50: 73 75 63 68 20 61 73 20 53 54 5f 49 6e 74 65 72  such as ST_Inter
0a60: 73 65 63 74 73 2c 20 53 54 5f 54 6f 75 63 68 65  sects, ST_Touche
0a70: 73 2c 20 53 54 5f 43 6f 76 65 72 73 20 65 74 63  s, ST_Covers etc
0a80: 2e 2c 20 74 6f 20 62 65 63 6f 6d 65 20 65 78 74  ., to become ext
0a90: 72 65 6d 65 6c 79 20 73 6c 6f 77 2e 3c 62 72 3e  remely slow.<br>
0aa0: 3c 62 72 3e 0d 0a 3c 74 61 62 6c 65 20 62 67 63  <br>..<table bgc
0ab0: 6f 6c 6f 72 3d 22 23 65 30 66 66 65 30 22 20 63  olor="#e0ffe0" c
0ac0: 65 6c 6c 73 70 61 63 69 6e 67 3d 22 38 22 20 63  ellspacing="8" c
0ad0: 65 6c 6c 70 61 64 64 69 6e 67 3d 22 36 22 20 62  ellpadding="6" b
0ae0: 6f 72 64 65 72 3d 22 31 22 3e 0d 0a 3c 74 72 3e  order="1">..<tr>
0af0: 3c 74 68 3e 53 51 4c 20 71 75 65 72 79 3c 2f 74  <th>SQL query</t
0b00: 68 3e 3c 74 68 3e 56 69 73 75 61 6c 20 53 61 6d  h><th>Visual Sam
0b10: 70 6c 65 3c 2f 74 68 3e 3c 2f 74 72 3e 0d 0a 3c  ple</th></tr>..<
0b20: 74 72 3e 0d 0a 3c 74 64 3e 0d 0a 3c 76 65 72 62  tr>..<td>..<verb
0b30: 61 74 69 6d 3e 0d 0a 53 45 4c 45 43 54 20 53 54  atim>..SELECT ST
0b40: 5f 53 75 62 64 69 76 69 64 65 28 67 65 6f 6d 65  _Subdivide(geome
0b50: 74 72 79 29 20 46 52 4f 4d 20 74 75 73 63 61 6e  try) FROM tuscan
0b60: 79 3b 0d 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d  y;..</verbatim>.
0b70: 0a 69 6e 20 74 68 69 73 20 66 69 72 73 74 20 63  .in this first c
0b80: 61 6c 6c 2c 20 77 69 74 68 20 6e 6f 20 6f 70 74  all, with no opt
0b90: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 73  ional argument s
0ba0: 70 65 63 69 66 69 65 64 2c 20 3c 62 3e 53 54 5f  pecified, <b>ST_
0bb0: 53 75 62 64 69 76 69 64 65 28 29 3c 2f 62 3e 20  Subdivide()</b> 
0bc0: 77 69 6c 6c 20 73 74 61 72 74 20 73 70 6c 69 74  will start split
0bd0: 74 69 6e 67 20 3c 62 3e 61 66 74 65 72 3c 2f 62  ting <b>after</b
0be0: 3e 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61  > use the standa
0bf0: 72 64 20 74 68 72 65 73 68 6f 6c 64 20 6f 66 20  rd threshold of 
0c00: 3c 62 3e 31 32 38 20 56 65 72 74 69 63 65 73 3c  <b>128 Vertices<
0c10: 2f 62 3e 20 69 73 20 65 78 63 65 65 64 65 64 2e  /b> is exceeded.
0c20: 3c 62 72 3e 3c 62 72 3e 0d 0a 41 73 20 74 68 65  <br><br>..As the
0c30: 20 73 69 64 65 20 66 69 67 75 72 65 20 73 68 6f   side figure sho
0c40: 77 73 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64  ws, the returned
0c50: 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   result is a col
0c60: 6c 65 63 74 69 6f 6e 20 6f 66 20 61 62 6f 75 74  lection of about
0c70: 20 34 2c 33 30 30 2b 20 65 6c 65 6d 65 6e 74 61   4,300+ elementa
0c80: 72 79 20 70 61 72 74 73 2e 0d 0a 3c 2f 74 64 3e  ry parts...</td>
0c90: 0d 0a 3c 74 64 3e 0d 0a 3c 69 6d 67 20 73 72 63  ..<td>..<img src
0ca0: 3d 22 68 74 74 70 73 3a 2f 2f 77 77 77 2e 67 61  ="https://www.ga
0cb0: 69 61 2d 67 69 73 2e 69 74 2f 67 61 69 61 2d 73  ia-gis.it/gaia-s
0cc0: 69 6e 73 2f 73 75 62 64 69 76 69 64 65 2f 73 75  ins/subdivide/su
0cd0: 62 31 32 38 2e 70 6e 67 22 20 61 6c 74 3d 22 6d  b128.png" alt="m
0ce0: 61 78 3d 31 32 38 22 3e 0d 0a 3c 2f 74 64 3e 0d  ax=128">..</td>.
0cf0: 0a 3c 2f 74 72 3e 0d 0a 3c 74 72 3e 0d 0a 3c 74  .</tr>..<tr>..<t
0d00: 64 3e 0d 0a 3c 76 65 72 62 61 74 69 6d 3e 0d 0a  d>..<verbatim>..
0d10: 53 45 4c 45 43 54 20 53 54 5f 53 75 62 64 69 76  SELECT ST_Subdiv
0d20: 69 64 65 28 67 65 6f 6d 65 74 72 79 2c 20 35 31  ide(geometry, 51
0d30: 32 29 20 46 52 4f 4d 20 74 75 73 63 61 6e 79 3b  2) FROM tuscany;
0d40: 0d 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d 0a 69  ..</verbatim>..i
0d50: 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61  n this second ca
0d60: 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20  ll the optional 
0d70: 61 72 67 75 6d 65 6e 74 20 69 73 20 65 78 70 6c  argument is expl
0d80: 69 63 69 74 6c 79 20 73 65 74 2c 20 61 6e 64 20  icitly set, and 
0d90: 3c 62 3e 53 54 5f 53 75 62 64 69 76 69 64 65 28  <b>ST_Subdivide(
0da0: 29 3c 2f 62 3e 20 69 73 20 6e 6f 77 20 61 73 73  )</b> is now ass
0db0: 75 6d 69 6e 67 20 61 20 74 68 72 65 73 68 6f 6c  uming a threshol
0dc0: 64 20 6f 66 20 3c 62 3e 35 31 32 20 56 65 72 74  d of <b>512 Vert
0dd0: 69 63 65 73 3c 2f 62 3e 2e 3c 62 72 3e 3c 62 72  ices</b>.<br><br
0de0: 3e 0d 0a 41 73 20 74 68 65 20 73 69 64 65 20 66  >..As the side f
0df0: 69 67 75 72 65 20 73 68 6f 77 73 2c 20 74 68 65  igure shows, the
0e00: 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
0e10: 20 69 73 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e   is a collection
0e20: 20 6f 66 20 61 62 6f 75 74 20 31 2c 38 30 30 2b   of about 1,800+
0e30: 20 65 6c 65 6d 65 6e 74 61 72 79 20 70 61 72 74   elementary part
0e40: 73 2e 0d 0a 3c 2f 74 64 3e 0d 0a 3c 74 64 3e 0d  s...</td>..<td>.
0e50: 0a 3c 69 6d 67 20 73 72 63 3d 22 68 74 74 70 73  .<img src="https
0e60: 3a 2f 2f 77 77 77 2e 67 61 69 61 2d 67 69 73 2e  ://www.gaia-gis.
0e70: 69 74 2f 67 61 69 61 2d 73 69 6e 73 2f 73 75 62  it/gaia-sins/sub
0e80: 64 69 76 69 64 65 2f 73 75 62 35 31 32 2e 70 6e  divide/sub512.pn
0e90: 67 22 20 61 6c 74 3d 22 6d 61 78 3d 35 31 32 22  g" alt="max=512"
0ea0: 3e 0d 0a 3c 2f 74 64 3e 0d 0a 3c 2f 74 72 3e 0d  >..</td>..</tr>.
0eb0: 0a 3c 74 72 3e 0d 0a 3c 74 64 3e 0d 0a 3c 76 65  .<tr>..<td>..<ve
0ec0: 72 62 61 74 69 6d 3e 0d 0a 53 45 4c 45 43 54 20  rbatim>..SELECT 
0ed0: 53 54 5f 53 75 62 64 69 76 69 64 65 28 67 65 6f  ST_Subdivide(geo
0ee0: 6d 65 74 72 79 2c 20 32 30 34 38 29 20 46 52 4f  metry, 2048) FRO
0ef0: 4d 20 74 75 73 63 61 6e 79 3b 0d 0a 3c 2f 76 65  M tuscany;..</ve
0f00: 72 62 61 74 69 6d 3e 0d 0a 69 6e 20 74 68 69 73  rbatim>..in this
0f10: 20 74 68 69 72 64 20 61 6e 64 20 66 69 6e 61 6c   third and final
0f20: 20 63 61 6c 6c 20 74 68 65 20 74 68 72 65 73 68   call the thresh
0f30: 6f 6c 64 20 69 73 20 73 65 74 20 74 6f 20 73 74  old is set to st
0f40: 61 72 74 20 61 66 74 65 72 20 3c 62 3e 32 2c 30  art after <b>2,0
0f50: 34 38 20 56 65 72 74 69 63 65 73 3c 2f 62 3e 2e  48 Vertices</b>.
0f60: 3c 62 72 3e 3c 62 72 3e 0d 0a 41 73 20 73 68 6f  <br><br>..As sho
0f70: 77 6e 20 62 79 20 74 68 65 20 66 69 67 75 72 65  wn by the figure
0f80: 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  , the returned r
0f90: 65 73 75 6c 74 20 69 73 20 6e 6f 77 20 61 20 63  esult is now a c
0fa0: 6f 6c 6c 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69  ollection contai
0fb0: 6e 69 6e 67 20 6f 6e 6c 79 20 31 2c 32 30 30 2b  ning only 1,200+
0fc0: 20 65 6c 65 6d 65 6e 74 61 72 79 20 70 61 72 74   elementary part
0fd0: 73 2e 0d 0a 3c 68 33 3e 53 68 6f 72 74 20 63 6f  s...<h3>Short co
0fe0: 6e 63 6c 75 73 69 6f 6e 3c 2f 68 33 3e 0d 0a 3c  nclusion</h3>..<
0ff0: 62 3e 53 54 5f 53 75 62 64 69 76 69 64 65 28 29  b>ST_Subdivide()
1000: 3c 2f 62 3e 20 69 73 20 76 65 72 79 20 63 61 70  </b> is very cap
1010: 61 62 6c 65 20 6f 66 20 73 75 62 64 69 76 69 64  able of subdivid
1020: 69 6e 67 20 61 20 68 75 67 65 2c 20 6e 61 73 74  ing a huge, nast
1030: 79 2c 20 47 65 6f 6d 65 74 72 79 20 69 6e 74 6f  y, Geometry into
1040: 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66   a collection of
1050: 20 73 6d 61 6c 6c 65 72 20 70 61 72 74 73 2c 20   smaller parts, 
1060: 74 68 61 74 20 63 61 6e 20 62 65 20 68 61 6e 64  that can be hand
1070: 6c 65 64 20 69 6e 20 61 20 6d 6f 72 65 20 72 65  led in a more re
1080: 61 73 6f 6e 61 62 6c 65 20 6d 61 6e 6e 65 72 2e  asonable manner.
1090: 3c 62 72 3e 0d 0a 41 6e 64 20 69 74 27 73 20 61  <br>..And it's a
10a0: 79 20 66 6c 65 78 69 62 6c 65 20 61 6e 64 20 65  y flexible and e
10b0: 61 73 79 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65  asy to customize
10c0: 3b 20 79 6f 75 20 6a 75 73 74 20 68 61 76 65 20  ; you just have 
10d0: 74 6f 20 73 65 74 20 61 6e 20 61 70 70 72 6f 70  to set an approp
10e0: 72 69 61 74 65 20 3c 62 3e 56 65 72 74 69 63 65  riate <b>Vertice
10f0: 73 3c 2f 62 3e 20 74 68 72 65 73 68 6f 6c 64 2e  s</b> threshold.
1100: 0d 0a 3c 2f 74 64 3e 0d 0a 3c 74 64 3e 0d 0a 3c  ..</td>..<td>..<
1110: 69 6d 67 20 73 72 63 3d 22 68 74 74 70 73 3a 2f  img src="https:/
1120: 2f 77 77 77 2e 67 61 69 61 2d 67 69 73 2e 69 74  /www.gaia-gis.it
1130: 2f 67 61 69 61 2d 73 69 6e 73 2f 73 75 62 64 69  /gaia-sins/subdi
1140: 76 69 64 65 2f 73 75 62 32 30 34 38 2e 70 6e 67  vide/sub2048.png
1150: 22 20 61 6c 74 3d 22 6d 61 78 3d 32 30 34 38 22  " alt="max=2048"
1160: 3e 0d 0a 3c 2f 74 64 3e 0d 0a 3c 2f 74 72 3e 0d  >..</td>..</tr>.
1170: 0a 3c 2f 74 61 62 6c 65 3e 0d 0a 3c 62 72 3e 0d  .</table>..<br>.
1180: 0a 48 6f 77 65 76 65 72 2c 20 61 20 62 69 67 20  .However, a big 
1190: 64 69 73 61 64 76 61 6e 74 61 67 65 20 73 68 6f  disadvantage sho
11a0: 75 6c 64 20 62 65 20 61 6c 77 61 79 73 20 62 65  uld be always be
11b0: 20 63 6f 6e 73 69 64 65 72 65 64 20 77 68 65 6e   considered when
11c0: 20 75 73 69 6e 67 20 74 68 65 20 6d 75 6c 74 69   using the multi
11d0: 2d 70 61 72 74 20 63 6f 6c 6c 65 63 74 69 6f 6e  -part collection
11e0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 3c 62  s returned by <b
11f0: 3e 53 54 5f 53 75 62 64 69 76 69 64 65 28 29 3c  >ST_Subdivide()<
1200: 2f 62 3e 2e 3c 62 72 3e 0d 0a 41 74 20 6c 65 61  /b>.<br>..At lea
1210: 73 74 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  st in the case o
1220: 66 20 3c 62 3e 4d 75 6c 74 69 50 6f 6c 79 67 6f  f <b>MultiPolygo
1230: 6e 73 3c 2f 62 3e 2c 20 61 6e 79 20 63 6f 6c 6c  ns</b>, any coll
1240: 65 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ection returned 
1250: 62 79 20 53 54 5f 53 75 62 64 69 76 69 64 65 28  by ST_Subdivide(
1260: 29 20 69 73 20 69 6e 68 65 72 65 6e 74 6c 79 20  ) is inherently 
1270: 69 6e 76 61 6c 69 64 2c 20 61 73 20 74 68 65 20  invalid, as the 
1280: 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 71 75  following SQL qu
1290: 65 72 79 20 64 65 6d 6f 6e 73 74 72 61 74 65 73  ery demonstrates
12a0: 3a 0d 0a 3c 76 65 72 62 61 74 69 6d 3e 0d 0a 53  :..<verbatim>..S
12b0: 45 4c 45 43 54 20 53 54 5f 49 73 56 61 6c 69 64  ELECT ST_IsValid
12c0: 28 53 54 5f 53 75 62 64 69 76 69 64 65 28 67 65  (ST_Subdivide(ge
12d0: 6f 6d 65 74 72 79 29 29 20 46 52 4f 4d 20 74 75  ometry)) FROM tu
12e0: 73 63 61 6e 79 3b 0d 0a 2d 2d 2d 2d 2d 2d 2d 2d  scany;..--------
12f0: 2d 0d 0a 30 0d 0a 3c 2f 76 65 72 62 61 74 69 6d  -..0..</verbatim
1300: 3e 0d 0a 49 74 27 73 20 6e 6f 74 20 61 74 20 61  >..It's not at a
1310: 6c 6c 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  ll difficult to 
1320: 75 6e 64 65 72 73 74 61 6e 64 20 77 68 79 20 74  understand why t
1330: 68 69 73 20 69 73 20 73 6f 2e 3c 62 72 3e 0d 0a  his is so.<br>..
1340: 41 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20 73  Accordingly to s
1350: 74 61 6e 64 61 72 64 20 3c 62 3e 4f 47 43 2f 53  tandard <b>OGC/S
1360: 46 53 3c 2f 62 3e 20 72 75 6c 65 73 3a 20 74 77  FS</b> rules: tw
1370: 6f 20 73 69 6e 67 6c 65 2d 70 61 72 74 20 50 6f  o single-part Po
1380: 6c 79 67 6f 6e 73 2c 20 62 65 6c 6f 6e 67 69 6e  lygons, belongin
1390: 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 4d 75  g to the same Mu
13a0: 6c 74 69 50 6f 6c 79 67 6f 6e 2c 20 61 72 65 20  ltiPolygon, are 
13b0: 61 6c 77 61 79 73 20 66 6f 72 62 69 64 64 65 6e  always forbidden
13c0: 20 74 6f 20 73 68 61 72 65 20 61 20 63 6f 6d 6d   to share a comm
13d0: 6f 6e 20 62 6f 72 64 65 72 2e 3c 62 72 3e 0d 0a  on border.<br>..
13e0: 4d 6f 72 65 20 70 72 65 63 69 73 65 6c 79 3a 20  More precisely: 
13f0: 74 68 65 79 20 63 61 6e 20 6f 6e 6c 79 20 74 6f  they can only to
1400: 75 63 68 20 6f 6e 20 73 70 65 63 69 66 69 63 20  uch on specific 
1410: 70 6f 69 6e 74 28 73 29 2c 20 62 75 74 20 74 68  point(s), but th
1420: 65 79 20 63 61 6e 20 6e 65 76 65 72 20 73 68 61  ey can never sha
1430: 72 65 20 61 20 63 6f 6d 6d 6f 6e 20 62 6f 75 6e  re a common boun
1440: 64 61 72 79 2e 3c 62 72 3e 3c 62 72 3e 0d 0a 3c  dary.<br><br>..<
1450: 74 61 62 6c 65 20 62 67 63 6f 6c 6f 72 3d 22 23  table bgcolor="#
1460: 66 66 64 30 64 30 22 20 63 65 6c 6c 73 70 61 63  ffd0d0" cellspac
1470: 69 6e 67 3d 22 38 22 20 63 65 6c 6c 70 61 64 64  ing="8" cellpadd
1480: 69 6e 67 3d 22 36 22 3e 0d 0a 3c 74 72 3e 3c 74  ing="6">..<tr><t
1490: 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22  d align="center"
14a0: 3e 3c 68 33 3e 5b 26 69 65 78 63 6c 3b 26 69 65  ><h3>[&iexcl;&ie
14b0: 78 63 6c 3b 26 69 65 78 63 6c 3b 20 57 61 72 6e  xcl;&iexcl; Warn
14c0: 69 6e 67 20 21 21 21 5d 3c 2f 68 33 3e 3c 2f 74  ing !!!]</h3></t
14d0: 64 3e 3c 2f 74 72 3e 0d 0a 3c 74 72 3e 3c 74 64  d></tr>..<tr><td
14e0: 3e 3c 62 3e 4e 65 76 65 72 2c 20 65 76 65 72 2c  ><b>Never, ever,
14f0: 20 70 61 73 73 20 73 75 63 68 20 61 20 47 65 6f   pass such a Geo
1500: 6d 65 74 72 79 20 20 74 6f 20 61 6e 79 20 53 70  metry  to any Sp
1510: 61 74 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 73  atial operator s
1520: 75 63 68 20 61 73 20 53 54 5f 49 6e 74 65 72 73  uch as ST_Inters
1530: 65 63 74 73 2c 20 53 54 5f 54 6f 75 63 68 65 73  ects, ST_Touches
1540: 2c 20 53 54 5f 43 6f 76 65 72 73 20 65 74 63 2e  , ST_Covers etc.
1550: 2e 3c 62 72 3e 3c 62 72 3e 0d 0a 54 68 69 73 20  .<br><br>..This 
1560: 77 69 6c 6c 20 63 65 72 74 61 69 6e 6c 79 20 64  will certainly d
1570: 72 69 76 65 20 74 68 65 20 3c 62 3e 47 45 4f 53  rive the <b>GEOS
1580: 3c 2f 62 3e 20 6c 69 62 72 61 72 79 20 6e 75 74  </b> library nut
1590: 74 79 2e 3c 62 72 3e 0d 0a 49 6e 63 6f 72 72 65  ty.<br>..Incorre
15a0: 63 74 20 72 65 73 75 6c 74 73 20 6d 61 79 20 65  ct results may e
15b0: 61 73 69 6c 79 20 66 6f 6c 6c 6f 77 2e 3c 62 72  asily follow.<br
15c0: 3e 0d 0a 41 6e 64 20 69 6e 20 74 68 65 20 77 6f  >..And in the wo
15d0: 72 73 74 20 63 61 73 65 20 73 6f 6d 65 20 75 6e  rst case some un
15e0: 65 78 70 65 63 74 65 64 20 63 72 61 73 68 20 63  expected crash c
15f0: 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
1600: 6f 63 63 75 72 2e 0d 0a 3c 68 33 3e 59 6f 75 20  occur...<h3>You 
1610: 68 61 76 65 20 62 65 65 6e 20 77 61 72 6e 65 64  have been warned
1620: 20 21 21 21 3c 2f 68 33 3e 0d 0a 3c 2f 74 64 3e   !!!</h3>..</td>
1630: 0d 0a 3c 2f 74 72 3e 0d 0a 3c 2f 74 61 62 6c 65  ..</tr>..</table
1640: 3e 0d 0a 3c 62 72 3e 3c 62 72 3e 0d 0a 3c 68 72  >..<br><br>..<hr
1650: 3e 0d 0a 3c 68 32 3e 41 64 76 61 6e 63 65 64 20  >..<h2>Advanced 
1660: 53 61 6d 70 6c 65 73 3c 2f 68 32 3e 0d 0a 4e 6f  Samples</h2>..No
1670: 77 20 77 65 27 6c 6c 20 67 6f 20 6f 6e 20 74 6f  w we'll go on to
1680: 20 65 78 70 6c 6f 72 65 20 74 68 65 20 72 65 61   explore the rea
1690: 6c 20 65 66 66 65 63 74 69 76 65 6e 65 73 73 20  l effectiveness 
16a0: 6f 66 20 3c 62 3e 53 54 5f 53 75 62 64 69 76 69  of <b>ST_Subdivi
16b0: 64 65 28 29 3c 2f 62 3e 20 66 6f 72 20 6f 6e 65  de()</b> for one
16c0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d   of the most com
16d0: 6d 6f 6e 20 53 70 61 74 69 61 6c 20 50 72 6f 62  mon Spatial Prob
16e0: 6c 65 6d 73 3a 20 69 64 65 6e 74 69 66 79 69 6e  lems: identifyin
16f0: 67 20 61 6c 6c 20 69 6e 74 65 72 73 65 63 74 69  g all intersecti
1700: 6f 6e 73 20 62 65 74 77 65 65 6e 20 61 20 64 61  ons between a da
1710: 74 61 73 65 74 20 6f 66 20 74 68 65 20 50 4f 49  taset of the POI
1720: 4e 54 20 74 79 70 65 20 61 6e 64 20 61 20 68 75  NT type and a hu
1730: 67 65 20 50 6f 6c 79 67 6f 6e 2f 4d 75 6c 74 69  ge Polygon/Multi
1740: 50 6f 6c 79 67 6f 6e 2e 3c 62 72 3e 3c 62 72 3e  Polygon.<br><br>
1750: 0d 0a 44 75 72 69 6e 67 20 74 68 69 73 20 73 65  ..During this se
1760: 63 6f 6e 64 20 74 65 73 74 20 77 65 27 6c 6c 20  cond test we'll 
1770: 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  use the followin
1780: 67 20 64 61 74 61 73 65 74 73 3a 0d 0a 3c 75 6c  g datasets:..<ul
1790: 3e 0d 0a 3c 6c 69 3e 75 73 69 6e 67 2c 20 6f 6e  >..<li>using, on
17a0: 63 65 20 61 67 61 69 6e 2c 20 74 68 65 20 73 61  ce again, the sa
17b0: 6d 65 20 61 64 6d 69 6e 69 73 74 72 61 74 69 76  me administrativ
17c0: 65 20 62 6f 75 6e 64 61 72 79 20 6f 66 20 54 75  e boundary of Tu
17d0: 73 63 61 6e 79 20 77 65 27 76 65 20 61 6c 72 65  scany we've alre
17e0: 61 64 79 20 75 73 65 64 20 62 65 66 6f 72 65 2e  ady used before.
17f0: 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 66 6f 72 20 74  </li>..<li>for t
1800: 68 65 20 50 4f 49 4e 54 20 64 61 74 61 73 65 74  he POINT dataset
1810: 20 77 65 27 6c 6c 20 75 73 65 20 74 68 65 20 3c   we'll use the <
1820: 62 3e 63 69 76 69 63 69 3c 2f 62 3e 20 53 68 61  b>civici</b> Sha
1830: 70 65 66 69 6c 65 20 28 3c 69 3e 48 6f 75 73 65  pefile (<i>House
1840: 20 4e 75 6d 62 65 72 73 3c 2f 69 3e 29 29 2c 20   Numbers</i>)), 
1850: 61 6c 73 6f 20 66 72 65 65 6c 79 20 61 76 61 69  also freely avai
1860: 6c 61 62 6c 65 2c 20 61 6e 64 20 63 61 6e 20 62  lable, and can b
1870: 65 20 64 6f 77 6e 6c 6f 61 64 20 68 65 72 65 20  e download here 
1880: 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f  <a href="http://
1890: 77 77 77 35 30 32 2e 72 65 67 69 6f 6e 65 2e 74  www502.regione.t
18a0: 6f 73 63 61 6e 61 2e 69 74 2f 67 65 6f 73 63 6f  oscana.it/geosco
18b0: 70 69 6f 2f 63 61 72 74 6f 74 65 63 61 2e 68 74  pio/cartoteca.ht
18c0: 6d 6c 22 3e 68 65 72 65 3c 2f 61 3e 20 28 73 65  ml">here</a> (se
18d0: 61 72 63 68 20 66 6f 72 20 3c 62 3e 47 72 61 66  arch for <b>Graf
18e0: 6f 20 53 74 72 61 64 61 6c 65 3c 2f 62 3e 20 2d  o Stradale</b> -
18f0: 20 3c 69 3e 52 6f 61 64 20 4e 65 74 77 6f 72 6b   <i>Road Network
1900: 3c 2f 69 3e 29 2e 3c 62 72 3e 0d 0a 54 68 69 73  </i>).<br>..This
1910: 20 74 6f 6f 20 69 73 20 61 20 68 75 67 65 20 64   too is a huge d
1920: 61 74 61 73 65 74 20 63 6f 6e 74 61 69 6e 69 6e  ataset containin
1930: 67 20 61 62 6f 75 74 20 31 2e 35 20 6d 69 6c 6c  g about 1.5 mill
1940: 69 6f 6e 20 70 6f 69 6e 74 73 2e 0d 0a 3c 2f 75  ion points...</u
1950: 6c 3e 0d 0a 3c 68 33 3e 41 20 66 69 72 73 74 20  l>..<h3>A first 
1960: 73 69 6d 70 6c 65 20 61 74 74 65 6d 70 74 3c 2f  simple attempt</
1970: 68 33 3e 0d 0a 3c 76 65 72 62 61 74 69 6d 3e 0d  h3>..<verbatim>.
1980: 0a 53 45 4c 45 43 54 20 43 6f 75 6e 74 28 2a 29  .SELECT Count(*)
1990: 0d 0a 46 52 4f 4d 20 63 69 76 69 63 69 20 41 53  ..FROM civici AS
19a0: 20 63 0d 0a 4c 45 46 54 20 4a 4f 49 4e 20 74 75   c..LEFT JOIN tu
19b0: 73 63 61 6e 79 20 41 53 20 74 20 4f 4e 20 28 53  scany AS t ON (S
19c0: 54 5f 49 6e 74 65 72 73 65 63 74 73 28 63 2e 67  T_Intersects(c.g
19d0: 65 6f 6d 65 74 72 79 2c 20 74 2e 67 65 6f 6d 65  eometry, t.geome
19e0: 74 72 79 29 20 3d 20 31 29 3b 0d 0a 0d 0a 0d 0a  try) = 1);......
19f0: 53 45 4c 45 43 54 20 43 6f 75 6e 74 28 2a 29 0d  SELECT Count(*).
1a00: 0a 46 52 4f 4d 20 63 69 76 69 63 69 20 41 53 20  .FROM civici AS 
1a10: 63 0d 0a 4c 45 46 54 20 4a 4f 49 4e 20 74 75 73  c..LEFT JOIN tus
1a20: 63 61 6e 79 20 41 53 20 74 20 4f 4e 20 28 53 54  cany AS t ON (ST
1a30: 5f 49 6e 74 65 72 73 65 63 74 73 28 63 2e 67 65  _Intersects(c.ge
1a40: 6f 6d 65 74 72 79 2c 20 74 2e 67 65 6f 6d 65 74  ometry, t.geomet
1a50: 72 79 29 20 3d 20 31 20 0d 0a 20 20 20 20 20 41  ry) = 1 ..     A
1a60: 4e 44 20 63 2e 72 6f 77 69 64 20 49 4e 20 28 0d  ND c.rowid IN (.
1a70: 0a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  .         SELECT
1a80: 20 72 6f 77 69 64 20 46 52 4f 4d 20 53 70 61 74   rowid FROM Spat
1a90: 69 61 6c 49 6e 64 65 78 0d 0a 20 20 20 20 20 20  ialIndex..      
1aa0: 20 20 20 57 48 45 52 45 20 66 5f 74 61 62 6c 65     WHERE f_table
1ab0: 5f 6e 61 6d 65 20 3d 20 27 63 69 76 69 63 69 27  _name = 'civici'
1ac0: 20 41 4e 44 20 73 65 61 72 63 68 5f 66 72 61 6d   AND search_fram
1ad0: 65 20 3d 20 74 2e 67 65 6f 6d 65 74 72 79 29 29  e = t.geometry))
1ae0: 3b 0d 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d 0a  ;..</verbatim>..
1af0: 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65  The only differe
1b00: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
1b10: 74 77 6f 20 53 51 4c 20 71 75 65 72 69 65 73 20  two SQL queries 
1b20: 69 73 20 69 6e 20 74 68 61 74 20 74 68 65 20 73  is in that the s
1b30: 65 63 6f 6e 64 20 6f 6e 65 20 65 78 70 6c 69 63  econd one explic
1b40: 69 74 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 53  itly calls the S
1b50: 70 61 74 69 61 6c 20 49 6e 64 65 78 2e 3c 62 72  patial Index.<br
1b60: 3e 3c 62 72 3e 0d 0a 3c 62 3e 41 63 74 75 61 6c  ><br>..<b>Actual
1b70: 20 66 69 6e 64 69 6e 67 73 3c 2f 62 3e 3a 0d 0a   findings</b>:..
1b80: 3c 75 6c 3e 0d 0a 3c 6c 69 3e 49 20 77 61 73 20  <ul>..<li>I was 
1b90: 66 6f 72 63 65 64 20 74 6f 20 70 72 65 6d 61 74  forced to premat
1ba0: 75 72 65 6c 79 20 61 62 6f 72 74 20 74 68 65 20  urely abort the 
1bb0: 66 69 72 73 74 20 74 65 73 74 20 77 68 65 6e 20  first test when 
1bc0: 49 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  I discovered tha
1bd0: 74 2c 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  t, during the fi
1be0: 72 73 74 20 68 61 6c 66 20 68 6f 75 72 2c 20 69  rst half hour, i
1bf0: 74 20 68 61 64 20 6d 61 64 65 20 6c 69 74 74 6c  t had made littl
1c00: 65 20 70 72 6f 67 72 65 73 73 2e 3c 62 72 3e 0d  e progress.<br>.
1c10: 0a 4d 79 20 65 73 74 69 6d 61 74 65 64 20 63 6f  .My estimated co
1c20: 6e 63 6c 75 73 69 6f 6e 20 77 61 73 20 74 68 61  nclusion was tha
1c30: 74 20 62 65 74 77 65 65 6e 20 34 20 61 6e 64 20  t between 4 and 
1c40: 36 20 68 6f 75 72 73 20 77 6f 75 6c 64 20 62 65  6 hours would be
1c50: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
1c60: 6d 70 6c 65 74 69 6f 6e 2e 3c 62 72 3e 0d 0a 44  mpletion.<br>..D
1c70: 65 66 69 6e 69 74 65 6c 79 20 74 68 69 73 20 69  efinitely this i
1c80: 73 6e 27 74 20 61 20 70 72 61 63 74 69 63 61 6c  sn't a practical
1c90: 20 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 20 6f 75   solution for ou
1ca0: 72 20 70 72 6f 62 6c 65 6d 2e 3c 2f 6c 69 3e 0d  r problem.</li>.
1cb0: 0a 3c 6c 69 3e 74 68 65 20 73 65 63 6f 6e 64 20  .<li>the second 
1cc0: 74 65 73 74 20 77 61 73 2c 20 69 66 20 70 6f 73  test was, if pos
1cd0: 73 69 62 6c 65 2c 20 65 76 65 6e 20 73 6c 6f 77  sible, even slow
1ce0: 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
1cf0: 74 20 6f 6e 65 2e 3c 62 72 3e 0d 0a 41 6e 64 20  t one.<br>..And 
1d00: 66 6f 72 20 76 65 72 79 20 67 6f 6f 64 20 72 65  for very good re
1d10: 61 73 6f 6e 73 2c 20 74 68 61 74 20 61 72 65 20  asons, that are 
1d20: 65 61 73 79 20 74 6f 20 65 78 70 6c 61 69 6e 3b  easy to explain;
1d30: 20 61 6c 6c 20 50 6f 69 6e 74 73 20 74 6f 20 62   all Points to b
1d40: 65 20 63 68 65 63 6b 65 64 20 66 61 6c 6c 20 69  e checked fall i
1d50: 6e 73 69 64 65 20 74 68 65 20 42 42 4f 58 20 6f  nside the BBOX o
1d60: 66 20 54 75 73 63 61 6e 79 2e 3c 62 72 3e 0d 0a  f Tuscany.<br>..
1d70: 53 6f 20 74 68 65 20 53 70 61 74 69 61 6c 20 49  So the Spatial I
1d80: 6e 64 65 78 20 69 73 6e 27 74 20 6f 66 20 61 6e  ndex isn't of an
1d90: 79 20 70 6f 73 73 69 62 6c 65 20 68 65 6c 70 2e  y possible help.
1da0: 3c 62 72 3e 0d 0a 41 6e 64 20 74 6f 20 6d 61 6b  <br>..And to mak
1db0: 65 20 6d 61 74 74 65 72 73 20 77 6f 72 73 74 2c  e matters worst,
1dc0: 20 71 75 65 72 79 69 6e 67 20 74 68 65 20 53 70   querying the Sp
1dd0: 61 74 69 61 6c 20 49 6e 64 65 78 20 69 6d 70 6f  atial Index impo
1de0: 73 65 73 20 61 20 66 75 72 74 68 65 72 20 6f 76  ses a further ov
1df0: 65 72 68 65 61 64 2c 20 74 68 75 73 20 72 65 71  erhead, thus req
1e00: 75 69 72 69 6e 67 20 61 20 66 61 72 20 6c 6f 6e  uiring a far lon
1e10: 67 65 72 20 74 69 6d 65 20 74 6f 20 61 63 68 69  ger time to achi
1e20: 65 76 65 20 61 62 73 6f 6c 75 74 65 6c 79 20 6e  eve absolutely n
1e30: 6f 74 68 69 6e 67 2e 3c 2f 6c 69 3e 0d 0a 3c 6c  othing.</li>..<l
1e40: 69 3e 3c 62 3e 53 68 6f 72 74 20 63 6f 6e 63 6c  i><b>Short concl
1e50: 75 73 69 6f 6e 3c 2f 62 3e 3a 20 63 6f 6d 70 75  usion</b>: compu
1e60: 74 69 6e 67 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66  ting millions of
1e70: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 73 20 62   intersections b
1e80: 65 74 77 65 65 6e 20 61 20 50 6f 69 6e 74 20 61  etween a Point a
1e90: 6e 64 20 61 20 50 6f 6c 79 67 6f 6e 2c 20 63 6f  nd a Polygon, co
1ea0: 6e 74 61 69 6e 69 6e 67 20 68 75 6e 64 72 65 64  ntaining hundred
1eb0: 73 20 6f 66 20 74 68 6f 75 73 61 6e 64 73 20 6f  s of thousands o
1ec0: 66 20 56 65 72 74 69 63 65 73 2c 20 69 73 20 61  f Vertices, is a
1ed0: 20 63 6f 6d 70 6c 65 78 20 63 6f 6d 70 75 74 61   complex computa
1ee0: 74 69 6f 6e 61 6c 20 70 72 6f 62 6c 65 6d 2e 3c  tional problem.<
1ef0: 62 72 3e 20 0d 0a 52 65 71 75 69 72 69 6e 67 20  br> ..Requiring 
1f00: 73 75 63 68 20 61 20 76 65 72 79 20 6c 6f 6e 67  such a very long
1f10: 20 74 69 6d 65 2c 20 6d 61 6b 65 73 20 73 75 63   time, makes suc
1f20: 68 20 61 20 73 6f 6c 75 74 69 6f 6e 20 61 62 73  h a solution abs
1f30: 6f 6c 75 74 65 6c 79 20 75 6e 70 72 61 63 74 69  olutely unpracti
1f40: 63 61 6c 2c 20 73 6f 20 61 20 6e 65 77 20 61 70  cal, so a new ap
1f50: 70 72 6f 63 68 20 74 6f 20 73 6f 6c 76 65 20 74  proch to solve t
1f60: 68 69 73 20 70 72 6f 62 6c 65 6d 20 69 73 20 6e  his problem is n
1f70: 65 65 64 65 64 2e 3c 2f 6c 69 3e 0d 0a 3c 2f 75  eeded.</li>..</u
1f80: 6c 3e 0d 0a 3c 68 33 3e 41 20 73 65 63 6f 6e 64  l>..<h3>A second
1f90: 20 61 74 74 65 6d 70 74 20 62 61 73 65 64 20 6f   attempt based o
1fa0: 6e 20 53 54 5f 53 75 62 64 69 76 69 64 65 28 29  n ST_Subdivide()
1fb0: 20 61 6e 64 20 56 69 72 74 75 61 6c 45 6c 65 6d   and VirtualElem
1fc0: 65 6e 74 61 72 79 3c 2f 68 33 3e 0d 0a 3c 76 65  entary</h3>..<ve
1fd0: 72 62 61 74 69 6d 3e 0d 0a 43 52 45 41 54 45 20  rbatim>..CREATE 
1fe0: 54 41 42 4c 45 20 78 78 20 28 69 64 20 49 4e 54  TABLE xx (id INT
1ff0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2000: 29 3b 0d 0a 53 45 4c 45 43 54 20 41 64 64 47 65  );..SELECT AddGe
2010: 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 27 78 78  ometryColumn('xx
2020: 27 2c 20 27 67 65 6f 6d 27 2c 20 33 30 30 33 2c  ', 'geom', 3003,
2030: 20 27 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 27 2c   'MULTIPOLYGON',
2040: 20 27 58 59 27 29 3b 0d 0a 49 4e 53 45 52 54 20   'XY');..INSERT 
2050: 49 4e 54 4f 20 78 78 20 56 41 4c 55 45 53 20 28  INTO xx VALUES (
2060: 31 2c 20 4e 55 4c 4c 29 3b 0d 0a 3c 2f 76 65 72  1, NULL);..</ver
2070: 62 61 74 69 6d 3e 0d 0a 57 65 27 6c 6c 20 73 74  batim>..We'll st
2080: 61 72 74 20 66 69 72 73 74 20 62 79 20 63 72 65  art first by cre
2090: 61 74 69 6e 67 20 61 20 63 6f 6e 76 65 6e 69 65  ating a convenie
20a0: 6e 63 65 20 54 61 62 6c 65 2c 20 77 68 69 63 68  nce Table, which
20b0: 20 77 69 6c 6c 20 73 74 6f 72 65 20 74 68 65 20   will store the 
20c0: 72 65 73 75 6c 74 20 6f 66 20 53 54 5f 53 75 62  result of ST_Sub
20d0: 64 69 76 69 64 65 28 29 2e 3c 62 72 3e 0d 0a 54  divide().<br>..T
20e0: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 73 69  his is a very si
20f0: 6d 70 6c 65 20 54 61 62 6c 65 3a 0d 0a 3c 75 6c  mple Table:..<ul
2100: 3e 0d 0a 3c 6c 69 3e 69 74 20 68 61 73 20 6a 75  >..<li>it has ju
2110: 73 74 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 2c 20  st two columns, 
2120: 61 20 50 72 69 6d 61 72 79 20 4b 65 79 20 61 6e  a Primary Key an
2130: 64 20 61 20 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e  d a MultiPolygon
2140: 20 47 65 6f 6d 65 74 72 79 2e 3c 2f 6c 69 3e 0d   Geometry.</li>.
2150: 0a 3c 6c 69 3e 61 6e 64 20 77 69 6c 6c 20 73 74  .<li>and will st
2160: 6f 72 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ore only a singl
2170: 65 20 72 6f 77 20 69 64 65 6e 74 69 66 69 65 64  e row identified
2180: 20 62 79 20 3c 62 3e 69 64 3d 31 3c 2f 62 3e 3c   by <b>id=1</b><
2190: 2f 6c 69 3e 0d 0a 3c 2f 75 6c 3e 0d 0a 3c 76 65  /li>..</ul>..<ve
21a0: 72 62 61 74 69 6d 3e 0d 0a 55 50 44 41 54 45 20  rbatim>..UPDATE 
21b0: 78 78 20 53 45 54 20 67 65 6f 6d 20 3d 20 28 53  xx SET geom = (S
21c0: 45 4c 45 43 54 20 53 54 5f 53 75 62 64 69 76 69  ELECT ST_Subdivi
21d0: 64 65 28 67 65 6f 6d 65 74 72 79 2c 20 32 30 34  de(geometry, 204
21e0: 38 29 20 46 52 4f 4d 20 74 75 73 63 61 6e 79 29  8) FROM tuscany)
21f0: 20 57 48 45 52 45 20 69 64 20 3d 20 31 3b 0d 0a   WHERE id = 1;..
2200: 53 45 4c 45 43 54 20 43 6f 75 6e 74 28 2a 29 0d  SELECT Count(*).
2210: 0a 46 52 4f 4d 20 45 6c 65 6d 65 6e 74 61 72 79  .FROM Elementary
2220: 47 65 6f 6d 65 74 72 69 65 73 20 41 53 20 74 0d  Geometries AS t.
2230: 0a 4a 4f 49 4e 20 63 69 76 69 63 69 20 41 53 20  .JOIN civici AS 
2240: 63 20 4f 4e 20 28 53 54 5f 49 6e 74 65 72 73 65  c ON (ST_Interse
2250: 63 74 73 28 63 2e 67 65 6f 6d 65 74 72 79 2c 20  cts(c.geometry, 
2260: 74 2e 67 65 6f 6d 65 74 72 79 29 20 3d 20 31 0d  t.geometry) = 1.
2270: 0a 20 20 20 20 20 41 4e 44 20 63 2e 72 6f 77 69  .     AND c.rowi
2280: 64 20 49 4e 20 28 0d 0a 20 20 20 20 20 20 20 20  d IN (..        
2290: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
22a0: 4f 4d 20 53 70 61 74 69 61 6c 49 6e 64 65 78 0d  OM SpatialIndex.
22b0: 0a 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20  .         WHERE 
22c0: 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d 20 27  f_table_name = '
22d0: 63 69 76 69 63 69 27 20 41 4e 44 20 73 65 61 72  civici' AND sear
22e0: 63 68 5f 66 72 61 6d 65 20 3d 20 74 2e 67 65 6f  ch_frame = t.geo
22f0: 6d 65 74 72 79 29 29 0d 0a 57 48 45 52 45 20 66  metry))..WHERE f
2300: 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d 20 27 78  _table_name = 'x
2310: 78 27 20 41 4e 44 20 6f 72 69 67 69 6e 5f 72 6f  x' AND origin_ro
2320: 77 69 64 20 3d 20 31 3b 0d 0a 2d 2d 2d 2d 2d 2d  wid = 1;..------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 31 34 38 30  ----------..1480
2340: 39 39 31 20 28 69 6e 20 33 38 2e 30 39 34 20 73  991 (in 38.094 s
2350: 65 63 6f 6e 64 73 29 0d 0a 0d 0a 0d 0a 55 50 44  econds)......UPD
2360: 41 54 45 20 78 78 20 53 45 54 20 67 65 6f 6d 20  ATE xx SET geom 
2370: 3d 20 28 53 45 4c 45 43 54 20 53 54 5f 53 75 62  = (SELECT ST_Sub
2380: 64 69 76 69 64 65 28 67 65 6f 6d 65 74 72 79 2c  divide(geometry,
2390: 20 35 31 32 29 20 46 52 4f 4d 20 74 75 73 63 61   512) FROM tusca
23a0: 6e 79 29 20 57 48 45 52 45 20 69 64 20 3d 20 31  ny) WHERE id = 1
23b0: 3b 0d 0a 53 45 4c 45 43 54 20 43 6f 75 6e 74 28  ;..SELECT Count(
23c0: 2a 29 0d 0a 46 52 4f 4d 20 45 6c 65 6d 65 6e 74  *)..FROM Element
23d0: 61 72 79 47 65 6f 6d 65 74 72 69 65 73 20 41 53  aryGeometries AS
23e0: 20 74 0d 0a 4a 4f 49 4e 20 63 69 76 69 63 69 20   t..JOIN civici 
23f0: 41 53 20 63 20 4f 4e 20 28 53 54 5f 49 6e 74 65  AS c ON (ST_Inte
2400: 72 73 65 63 74 73 28 63 2e 67 65 6f 6d 65 74 72  rsects(c.geometr
2410: 79 2c 20 74 2e 67 65 6f 6d 65 74 72 79 29 20 3d  y, t.geometry) =
2420: 20 31 0d 0a 20 20 20 20 20 41 4e 44 20 63 2e 72   1..     AND c.r
2430: 6f 77 69 64 20 49 4e 20 28 0d 0a 20 20 20 20 20  owid IN (..     
2440: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
2450: 20 46 52 4f 4d 20 53 70 61 74 69 61 6c 49 6e 64   FROM SpatialInd
2460: 65 78 0d 0a 20 20 20 20 20 20 20 20 20 57 48 45  ex..         WHE
2470: 52 45 20 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 20  RE f_table_name 
2480: 3d 20 27 63 69 76 69 63 69 27 20 41 4e 44 20 73  = 'civici' AND s
2490: 65 61 72 63 68 5f 66 72 61 6d 65 20 3d 20 74 2e  earch_frame = t.
24a0: 67 65 6f 6d 65 74 72 79 29 29 0d 0a 57 48 45 52  geometry))..WHER
24b0: 45 20 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d  E f_table_name =
24c0: 20 27 78 78 27 20 41 4e 44 20 6f 72 69 67 69 6e   'xx' AND origin
24d0: 5f 72 6f 77 69 64 20 3d 20 31 3b 0d 0a 2d 2d 2d  _rowid = 1;..---
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 31  -------------..1
24f0: 34 38 30 39 39 31 20 28 69 6e 20 31 32 2e 36 31  480991 (in 12.61
2500: 37 20 73 65 63 6f 6e 64 73 29 0d 0a 0d 0a 0d 0a  7 seconds)......
2510: 55 50 44 41 54 45 20 78 78 20 53 45 54 20 67 65  UPDATE xx SET ge
2520: 6f 6d 20 3d 20 28 53 45 4c 45 43 54 20 53 54 5f  om = (SELECT ST_
2530: 53 75 62 64 69 76 69 64 65 28 67 65 6f 6d 65 74  Subdivide(geomet
2540: 72 79 29 20 46 52 4f 4d 20 74 75 73 63 61 6e 79  ry) FROM tuscany
2550: 29 20 57 48 45 52 45 20 69 64 20 3d 20 31 3b 0d  ) WHERE id = 1;.
2560: 0a 53 45 4c 45 43 54 20 43 6f 75 6e 74 28 2a 29  .SELECT Count(*)
2570: 0d 0a 46 52 4f 4d 20 45 6c 65 6d 65 6e 74 61 72  ..FROM Elementar
2580: 79 47 65 6f 6d 65 74 72 69 65 73 20 41 53 20 74  yGeometries AS t
2590: 0d 0a 4a 4f 49 4e 20 63 69 76 69 63 69 20 41 53  ..JOIN civici AS
25a0: 20 63 20 4f 4e 20 28 53 54 5f 49 6e 74 65 72 73   c ON (ST_Inters
25b0: 65 63 74 73 28 63 2e 67 65 6f 6d 65 74 72 79 2c  ects(c.geometry,
25c0: 20 74 2e 67 65 6f 6d 65 74 72 79 29 20 3d 20 31   t.geometry) = 1
25d0: 0d 0a 20 20 20 20 20 41 4e 44 20 63 2e 72 6f 77  ..     AND c.row
25e0: 69 64 20 49 4e 20 28 0d 0a 20 20 20 20 20 20 20  id IN (..       
25f0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46    SELECT rowid F
2600: 52 4f 4d 20 53 70 61 74 69 61 6c 49 6e 64 65 78  ROM SpatialIndex
2610: 0d 0a 20 20 20 20 20 20 20 20 20 57 48 45 52 45  ..         WHERE
2620: 20 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d 20   f_table_name = 
2630: 27 63 69 76 69 63 69 27 20 41 4e 44 20 73 65 61  'civici' AND sea
2640: 72 63 68 5f 66 72 61 6d 65 20 3d 20 74 2e 67 65  rch_frame = t.ge
2650: 6f 6d 65 74 72 79 29 29 0d 0a 57 48 45 52 45 20  ometry))..WHERE 
2660: 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d 20 27  f_table_name = '
2670: 78 78 27 20 41 4e 44 20 6f 72 69 67 69 6e 5f 72  xx' AND origin_r
2680: 6f 77 69 64 20 3d 20 31 3b 0d 0a 2d 2d 2d 2d 2d  owid = 1;..-----
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 31 34 38  -----------..148
26a0: 30 39 39 31 20 28 69 6e 20 39 2e 35 33 34 20 73  0991 (in 9.534 s
26b0: 65 63 6f 6e 64 73 29 0d 0a 3c 2f 76 65 72 62 61  econds)..</verba
26c0: 74 69 6d 3e 0d 0a 3c 62 3e 51 75 69 63 6b 20 65  tim>..<b>Quick e
26d0: 76 61 6c 75 61 74 69 6f 6e 3c 2f 62 3e 3a 0d 0a  valuation</b>:..
26e0: 3c 75 6c 3e 0d 0a 3c 6c 69 3e 3c 62 3e 53 54 5f  <ul>..<li><b>ST_
26f0: 53 75 62 64 69 76 69 64 65 3c 2f 62 3e 20 64 65  Subdivide</b> de
2700: 66 69 6e 69 74 65 6c 79 20 69 73 20 74 68 65 20  finitely is the 
2710: 3c 62 3e 3c 69 3e 74 6f 6f 6c 20 6f 66 20 74 68  <b><i>tool of th
2720: 65 20 74 72 61 64 65 3c 2f 69 3e 3c 2f 62 3e 20  e trade</i></b> 
2730: 77 65 20 77 65 72 65 20 73 65 61 72 63 68 69 6e  we were searchin
2740: 67 20 66 6f 72 2e 3c 62 72 3e 0d 0a 49 74 20 65  g for.<br>..It e
2750: 66 66 65 63 74 69 76 65 6c 79 20 61 6c 6c 6f 77  ffectively allow
2760: 73 20 74 6f 20 72 65 73 6f 6c 76 65 20 61 20 63  s to resolve a c
2770: 6f 6d 70 75 74 61 74 69 6f 6e 61 6c 6c 79 20 63  omputationally c
2780: 6f 6d 70 6c 65 78 20 70 72 6f 62 6c 65 6d 20 69  omplex problem i
2790: 6e 20 61 20 73 75 72 70 72 69 73 69 6e 67 6c 79  n a surprisingly
27a0: 20 71 75 69 63 6b 20 74 69 6d 65 2e 3c 62 72 3e   quick time.<br>
27b0: 0d 0a 46 72 6f 6d 20 6d 61 6e 79 20 6c 6f 6e 67  ..From many long
27c0: 20 68 6f 75 72 73 2c 20 74 6f 20 6a 75 73 74 20   hours, to just 
27d0: 61 20 68 61 6e 64 66 75 6c 20 6f 66 20 73 65 63  a handful of sec
27e0: 6f 6e 64 73 2c 20 69 73 20 61 20 73 69 6e 67 75  onds, is a singu
27f0: 6c 61 72 6c 79 20 61 73 74 6f 6e 69 73 68 69 6e  larly astonishin
2800: 67 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 3c 62  g improvement.<b
2810: 72 3e 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 73 75 62  r></li>..<li>sub
2820: 64 69 76 69 64 69 6e 67 20 74 68 65 20 69 6e 69  dividing the ini
2830: 74 69 61 6c 20 68 75 67 65 20 50 6f 6c 79 67 6f  tial huge Polygo
2840: 6e 20 69 6e 74 6f 20 6d 61 6e 79 20 73 69 6d 70  n into many simp
2850: 6c 65 72 2f 73 6d 61 6c 6c 65 72 20 70 61 72 74  ler/smaller part
2860: 73 20 68 61 73 20 73 65 76 65 72 61 6c 20 62 65  s has several be
2870: 6e 65 66 69 63 69 61 6c 20 65 66 66 65 63 74 73  neficial effects
2880: 3a 0d 0a 3c 75 6c 3e 0d 0a 3c 6c 69 3e 74 68 65  :..<ul>..<li>the
2890: 20 74 69 6d 65 20 72 65 71 75 69 72 65 64 20 74   time required t
28a0: 6f 20 63 6f 6d 70 75 74 65 20 61 20 70 6f 69 6e  o compute a poin
28b0: 74 2d 74 6f 2d 70 6f 6c 79 67 6f 6e 20 69 6e 74  t-to-polygon int
28c0: 65 72 73 65 63 74 69 6f 6e 20 71 75 69 63 6b 6c  ersection quickl
28d0: 79 20 69 6e 63 72 65 61 73 65 73 20 77 69 74 68  y increases with
28e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 56   the number of V
28f0: 65 72 74 69 63 65 73 2e 3c 62 72 3e 0d 0a 53 6d  ertices.<br>..Sm
2900: 61 6c 6c 65 72 20 70 6f 6c 79 67 6f 6e 73 20 61  aller polygons a
2910: 72 65 20 6f 62 76 69 6f 75 73 6c 79 20 73 77 69  re obviously swi
2920: 66 74 65 72 20 74 6f 20 62 65 20 65 76 61 6c 75  fter to be evalu
2930: 61 74 65 64 20 74 68 61 6e 20 62 69 67 67 65 72  ated than bigger
2940: 20 6f 6e 65 73 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69   ones.</li>..<li
2950: 3e 73 6d 61 6c 6c 65 72 20 70 6f 6c 79 67 6f 6e  >smaller polygon
2960: 73 20 63 61 6e 20 62 65 20 61 6e 20 65 66 66 69  s can be an effi
2970: 63 69 65 6e 74 20 53 70 61 74 69 61 6c 20 49 6e  cient Spatial In
2980: 64 65 78 20 66 69 6c 74 65 72 2e 3c 2f 6c 69 3e  dex filter.</li>
2990: 0d 0a 3c 2f 75 6c 3e 3c 2f 6c 69 3e 0d 0a 3c 6c  ..</ul></li>..<l
29a0: 69 3e 75 73 69 6e 67 20 3c 62 3e 56 69 72 74 75  i>using <b>Virtu
29b0: 61 6c 45 6c 65 6d 65 6e 74 61 72 79 3c 2f 62 3e  alElementary</b>
29c0: 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  , in order to pr
29d0: 6f 63 65 73 73 20 61 6c 6c 20 73 75 62 2d 61 72  ocess all sub-ar
29e0: 65 61 73 20 6f 6e 65 20 62 79 20 6f 6e 65 2c 20  eas one by one, 
29f0: 73 75 72 65 6c 79 20 69 6d 70 6f 73 65 73 20 66  surely imposes f
2a00: 75 72 74 68 65 72 20 63 6f 6d 70 6c 65 78 69 74  urther complexit
2a10: 79 20 74 6f 20 6f 75 72 20 53 51 4c 20 71 75 65  y to our SQL que
2a20: 72 69 65 73 2e 3c 62 72 3e 0d 0a 42 75 74 20 69  ries.<br>..But i
2a30: 6e 20 74 68 65 20 65 6e 64 2c 20 74 68 69 73 20  n the end, this 
2a40: 6d 65 74 68 6f 64 20 70 72 6f 76 65 73 20 69 74  method proves it
2a50: 73 65 6c 66 20 74 6f 20 62 65 20 61 20 76 65 72  self to be a ver
2a60: 79 20 65 66 66 69 63 69 65 6e 74 20 6d 65 63 68  y efficient mech
2a70: 61 6e 69 73 6d 20 74 6f 20 72 65 73 6f 6c 76 65  anism to resolve
2a80: 20 74 68 69 73 20 63 6f 6d 70 6c 65 78 20 70 72   this complex pr
2a90: 6f 62 6c 65 6d 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69  oblem.</li>..<li
2aa0: 3e 3c 62 3e 4e 6f 74 65 3c 2f 62 3e 3a 20 53 70  ><b>Note</b>: Sp
2ab0: 61 74 69 61 4c 69 74 65 20 69 73 20 6e 6f 74 20  atiaLite is not 
2ac0: 50 6f 73 74 47 49 53 2c 20 61 6e 64 20 53 51 4c  PostGIS, and SQL
2ad0: 69 74 65 33 20 69 73 20 6e 6f 74 20 50 6f 73 74  ite3 is not Post
2ae0: 67 72 65 53 51 4c 3b 20 74 68 65 69 72 20 72 65  greSQL; their re
2af0: 73 70 65 63 74 69 76 65 20 69 6e 74 65 72 6e 61  spective interna
2b00: 6c 20 61 72 63 68 69 74 65 63 74 75 72 65 73 20  l architectures 
2b10: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 64 69  significantly di
2b20: 66 66 65 72 20 69 6e 20 6d 61 6e 79 20 77 61 79  ffer in many way
2b30: 73 2e 3c 62 72 3e 0d 0a 4d 6f 72 65 20 73 70 65  s.<br>..More spe
2b40: 63 69 66 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74  cifically, SQLit
2b50: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
2b60: 75 6e 61 62 6c 65 20 74 6f 20 73 75 70 70 6f 72  unable to suppor
2b70: 74 20 61 72 72 61 79 73 20 6f 72 20 6d 75 6c 74  t arrays or mult
2b80: 69 2d 72 6f 77 20 72 65 73 75 6c 74 73 2c 20 73  i-row results, s
2b90: 6f 20 75 73 69 6e 67 20 56 69 72 74 75 61 6c 45  o using VirtualE
2ba0: 6c 65 6d 65 6e 74 61 72 79 20 69 73 20 61 6e 20  lementary is an 
2bb0: 61 62 73 6f 6c 75 74 65 6c 79 20 6e 65 63 65 73  absolutely neces
2bc0: 73 61 72 79 20 77 6f 72 6b 61 72 6f 75 6e 64 2e  sary workaround.
2bd0: 3c 2f 6c 69 3e 0d 0a 3c 2f 75 6c 3e 0d 0a 3c 68  </li>..</ul>..<h
2be0: 33 3e 41 20 66 69 6e 61 6c 20 65 78 70 65 72 69  3>A final experi
2bf0: 6d 65 6e 74 61 6c 20 61 74 74 65 6d 70 74 20 62  mental attempt b
2c00: 61 73 65 64 20 6f 6e 20 61 20 70 75 72 65 20 53  ased on a pure S
2c10: 51 4c 20 61 70 70 72 6f 61 63 68 3c 2f 68 33 3e  QL approach</h3>
2c20: 0d 0a 41 6e 6f 74 68 65 72 20 61 6c 74 65 72 6e  ..Another altern
2c30: 61 74 69 76 65 20 6d 65 63 68 61 6e 69 73 6d 2c  ative mechanism,
2c40: 20 62 61 73 65 64 20 6f 6e 20 70 75 72 65 20 53   based on pure S
2c50: 51 4c 20 61 6e 64 20 6e 6f 74 20 72 65 71 75 69  QL and not requi
2c60: 72 69 6e 67 20 74 68 65 20 75 73 65 20 6f 66 20  ring the use of 
2c70: 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74  ElementaryGeomet
2c80: 72 69 65 73 20 6f 72 20 6f 66 20 61 20 63 6f 6e  ries or of a con
2c90: 76 65 6e 69 65 6e 63 65 20 54 61 62 6c 65 20 69  venience Table i
2ca0: 73 3a 0d 0a 3c 76 65 72 62 61 74 69 6d 3e 0d 0a  s:..<verbatim>..
2cb0: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 20 6d  WITH RECURSIVE m
2cc0: 61 67 69 63 28 6e 2c 20 67 65 6f 6d 29 20 41 53  agic(n, geom) AS
2cd0: 20 28 0d 0a 20 20 20 20 56 41 4c 55 45 53 28 31   (..    VALUES(1
2ce0: 2c 20 28 53 45 4c 45 43 54 20 53 54 5f 53 75 62  , (SELECT ST_Sub
2cf0: 64 69 76 69 64 65 28 67 65 6f 6d 65 74 72 79 2c  divide(geometry,
2d00: 20 32 30 34 38 29 20 46 52 4f 4d 20 74 75 73 63   2048) FROM tusc
2d10: 61 6e 79 29 29 0d 0a 20 20 20 20 55 4e 49 4f 4e  any))..    UNION
2d20: 20 41 4c 4c 0d 0a 20 20 20 20 53 45 4c 45 43 54   ALL..    SELECT
2d30: 20 6e 20 2b 20 31 2c 20 67 65 6f 6d 0d 0a 20 20   n + 1, geom..  
2d40: 20 20 46 52 4f 4d 20 67 65 6f 6d 5f 69 6e 64 0d    FROM geom_ind.
2d50: 0a 20 20 20 20 57 48 45 52 45 20 53 54 5f 47 65  .    WHERE ST_Ge
2d60: 6f 6d 65 74 72 79 4e 28 67 65 6f 6d 2c 20 6e 29  ometryN(geom, n)
2d70: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0d 0a 29 0d   IS NOT NULL..).
2d80: 0a 53 45 4c 45 43 54 20 6e 2c 20 53 54 5f 47 65  .SELECT n, ST_Ge
2d90: 6f 6d 65 74 72 79 4e 28 67 65 6f 6d 2c 20 6e 29  ometryN(geom, n)
2da0: 20 46 52 4f 4d 20 6d 61 67 69 63 3b 0d 0a 3c 2f   FROM magic;..</
2db0: 76 65 72 62 61 74 69 6d 3e 0d 0a 3c 75 6c 3e 0d  verbatim>..<ul>.
2dc0: 0a 3c 6c 69 3e 77 65 20 73 69 6d 70 6c 79 20 68  .<li>we simply h
2dd0: 61 76 65 20 74 6f 20 77 72 69 74 65 20 61 20 3c  ave to write a <
2de0: 62 3e 52 65 63 75 72 73 69 76 65 20 53 51 4c 20  b>Recursive SQL 
2df0: 51 75 65 72 79 3c 2f 62 3e 20 69 6e 20 6f 72 64  Query</b> in ord
2e00: 65 72 20 74 6f 20 67 65 74 20 61 20 6d 75 6c 74  er to get a mult
2e10: 69 2d 72 6f 77 20 72 65 73 75 6c 74 73 65 74 2c  i-row resultset,
2e20: 20 77 69 74 68 20 61 20 64 69 73 74 69 6e 63 74   with a distinct
2e30: 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 65 6c   row for each el
2e40: 65 6d 65 6e 74 61 72 79 20 70 61 72 74 2e 3c 2f  ementary part.</
2e50: 6c 69 3e 0d 0a 3c 6c 69 3e 69 74 20 65 66 66 65  li>..<li>it effe
2e60: 63 74 69 76 65 6c 79 20 77 6f 72 6b 73 2c 20 62  ctively works, b
2e70: 75 74 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73  ut seems to be s
2e80: 6c 6f 77 65 72 20 74 68 61 6e 20 45 6c 65 6d 65  lower than Eleme
2e90: 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65 73 2e  ntaryGeometries.
2ea0: 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 61 6e 64 20 65  </li>..<li>and e
2eb0: 76 65 6e 20 6d 6f 72 65 20 72 65 6c 65 76 61 6e  ven more relevan
2ec0: 74 2c 20 49 20 77 61 73 20 75 6e 61 62 6c 65 20  t, I was unable 
2ed0: 74 6f 20 77 72 69 74 65 20 61 20 63 6f 6d 70 6c  to write a compl
2ee0: 65 74 65 20 51 75 65 72 79 20 64 65 74 65 72 6d  ete Query determ
2ef0: 69 6e 69 6e 67 20 61 6c 6c 20 69 6e 74 65 72 73  ining all inters
2f00: 65 63 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 20  ections between 
2f10: 50 6f 69 6e 74 73 20 61 6e 64 20 50 6f 6c 79 67  Points and Polyg
2f20: 6f 6e 73 20 69 6e 20 61 20 72 65 61 73 6f 6e 61  ons in a reasona
2f30: 62 6c 65 20 74 69 6d 65 2e 3c 62 72 3e 0d 0a 49  ble time.<br>..I
2f40: 20 73 75 73 70 65 63 74 20 74 68 61 74 20 74 68   suspect that th
2f50: 65 20 51 75 65 72 79 20 4f 70 74 69 6d 69 7a 65  e Query Optimize
2f60: 72 20 6f 66 20 53 51 4c 69 74 65 20 73 69 6d 70  r of SQLite simp
2f70: 6c 79 20 69 67 6e 6f 72 65 73 20 74 68 65 20 53  ly ignores the S
2f80: 70 61 74 69 61 6c 20 49 6e 64 65 78 2c 20 74 68  patial Index, th
2f90: 75 73 20 72 75 69 6e 69 6e 67 20 61 6e 79 20 61  us ruining any a
2fa0: 64 76 61 6e 74 61 67 65 20 74 68 61 74 20 74 68  dvantage that th
2fb0: 69 73 20 61 70 70 72 6f 61 63 68 20 77 6f 75 6c  is approach woul
2fc0: 64 20 62 72 69 6e 67 2e 3c 62 72 3e 0d 0a 49 74  d bring.<br>..It
2fd0: 20 6d 61 79 20 77 65 6c 6c 20 62 65 2c 20 74 68   may well be, th
2fe0: 61 74 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  at someone else 
2ff0: 63 6f 75 6c 64 20 73 75 63 63 65 65 64 20 77 68  could succeed wh
3000: 65 72 65 20 49 20 66 61 69 6c 65 64 3b 20 61 6e  ere I failed; an
3010: 79 20 66 75 72 74 68 65 72 20 74 68 69 72 64 2d  y further third-
3020: 70 61 72 74 79 20 69 6e 76 65 73 74 69 67 61 74  party investigat
3030: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 73 70 65 63  ion on this spec
3040: 69 66 69 63 20 61 72 65 61 20 77 6f 75 6c 64 20  ific area would 
3050: 62 65 20 73 75 72 65 6c 79 20 77 65 6c 63 6f 6d  be surely welcom
3060: 65 2e 3c 2f 6c 69 3e 0d 0a 3c 2f 75 6c 3e 0d 0a  e.</li>..</ul>..
3070: 3c 62 72 3e 3c 62 72 3e 0d 0a 3c 68 72 3e 0d 0a  <br><br>..<hr>..
3080: 3c 62 72 3e 3c 62 72 3e 0d 0a 3c 74 61 62 6c 65  <br><br>..<table
3090: 20 77 69 64 74 68 3d 22 31 30 30 25 22 3e 3c 74   width="100%"><t
30a0: 72 3e 0d 0a 3c 74 64 20 77 69 64 74 68 3d 22 33  r>..<td width="3
30b0: 33 25 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22  3%" align="left"
30c0: 3e 3c 2f 74 64 3e 0d 0a 3c 74 64 20 61 6c 69 67  ></td>..<td alig
30d0: 6e 3d 22 63 65 6e 74 65 72 22 3e 3c 61 20 68 72  n="center"><a hr
30e0: 65 66 3d 22 68 74 74 70 73 3a 2f 2f 77 77 77 2e  ef="https://www.
30f0: 67 61 69 61 2d 67 69 73 2e 69 74 2f 66 6f 73 73  gaia-gis.it/foss
3100: 69 6c 2f 6c 69 62 73 70 61 74 69 61 6c 69 74 65  il/libspatialite
3110: 2f 77 69 6b 69 3f 6e 61 6d 65 3d 34 2e 33 2e 30  /wiki?name=4.3.0
3120: 2b 64 6f 63 22 3e 62 61 63 6b 20 74 6f 20 69 6e  +doc">back to in
3130: 64 65 78 3c 2f 61 3e 3c 2f 74 64 3e 0d 0a 3c 74  dex</a></td>..<t
3140: 64 20 77 69 64 74 68 3d 22 33 33 25 22 20 61 6c  d width="33%" al
3150: 69 67 6e 3d 22 72 69 67 68 74 22 3e 3c 2f 74 64  ign="right"></td
3160: 3e 0d 0a 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e  >..</tr></table>
3170: 0a 5a 20 63 33 39 36 34 39 30 34 61 65 37 33 62  .Z c3964904ae73b
3180: 32 34 36 36 30 62 35 65 35 33 33 62 65 36 35 39  24660b5e533be659
3190: 38 39 65 0a                                      89e.