Daha çox

PostGIS -də poliqona təpələr əlavə olunur?


Məsələn, düzbucaqlı çoxbucaqlıyam (4 təpə). Çoxbucağın hər sətrinə orta nöqtə əlavə etmək istəyirəm, buna görə ümumilikdə indi 8 təpəm var. Və onlardan eyni xarici ayaq izi olan, lakin 8 təpəsi olan yeni çoxbucaqlı qurmaq istəyirəm:

Etdiyim və işləməyən (binalarımdakı hər çoxbucaqda bunu etmək istəyirəm.shp): (yalançı alqoritm, "İLƏ ... AS" ilə işləyirəm)

  1. Bütün orijinal zirvələri əldə edin (4 qara)ST_DumpPointsbinalarda iki dəfə (!)

    ST_Line_Interpolate_Point- tətbiq etmək üçün çoxbucaqlı binaların sərhədlərini xətt sətirləri kimi hazırlayın.

  2. Eyni çoxbucaqlı təpələr arasındakı bütün mümkün xətlər:ST_MakeLine (ballar1.geom, nöqtələr2.geom) HARADA (nöqtələr1.yol <> nöqtələr2.yol) VƏ (ballar1.id = ballar2.id)

  3. Binaların sərhədləri:ST_ExteriorRing (the_geom) ON (ST_Dump (build.geom)). Geom AS the_geom

  4. @ 2 sətirlərindən yalnız sərhəd xətlərini seçin:St_touches (build.geom, xətlər.geom) VƏ St_touches (border.geom, xətlər.geom) = yanlış AND xətləri.id = build.id VƏ xətlər.id = border.id-eyni binanın bütün nöqtələri, eyni binanın bütün xətləri binaya aid eyni idə malikdir

  5. Orta balları əldə edin:ST_Line_Interpolate_Point (border_lines.geom, 0.5)(yaşıl nöqtələr)

  6. BİRLİKbal 1 və xal @ 5

İndi problem ondadır ki, @ 6 nöqtələrində heç bir sifarişim yoxdur, buna görə istifadə etmək demək olar ki, mümkün deyilST_MakePolygonvə hiylələrST_ConcaveHull&ST_ConvexHullorta nöqtəni görmədikləri üçün işləmirəm və nəticədə başladığım yerə qayıdıram.


Son addım olaraq ST_Snap http://postgis.net/docs/ST_Snap.html istifadə edin. Giriş həndəsələri olaraq MultiPoint olaraq əlavə olunmaq üçün orijinal çoxbucaqlı və əlavə təpələr lazımdır. Üçüncü funksiya, tolerantlıqdır.

SEÇ ST_Snap (ST_GeomFromText ('POLYGON ((7 7, 7 11, 11 11, 11 7, 7 7))' '), ST_GeomFromtext (' MULTIPOINT ((11 9), (7 9), (9 11), (9 7)) '), 0.01);

Nəticə, MultiPoint -dən yeni təpələr əlavə edən bir çoxbucaqlıdır:

POLYGON ((7 7, 7 9, 7 11, 9 11, 11 11, 11 9, 11 7, 9 7, 7 7))


Sadə alternativ bir həll ST_Segmentize () ola bilər. Bu funksiya çoxbucağınıza heç bir seqmentin verilən uzunluqdan artıq olmaması üçün uclar əlavə edəcək. Əgər dəqiq orta nöqtələrdən istifadə etməyiniz vacibdirsə, bu heç də yaxşı deyil, amma həqiqətən də həndəsənizə mürəkkəblik əlavə etmək istəyirsənsə əla olar.