Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2013-04-30

Intersect or not Disjoint

Продолжаю работать над Mapfeatureserver.

В PostGIS есть интересный оператор «&&», вот его описание:

A && B
The "&&" operator is the "overlaps" operator. If A's bounding box overlaps B's bounding box the operator returns true.

Обратите внимание — рассматриваются охватывающие боксы фигур. Это очень удобный оператор в плане быстродействия, для поиска задействуется пространственный индекс и более ничего. Но в плане корректности результата это уже не так хорошо.

Вот пример вычисления ответа на REST запрос к featureserver ArcGIS:
запрос http://vags101.algis.com/arcgis/rest/services/seisprofiles/FeatureServer/1/query?returnGeometry=true&geometryType=esriGeometryEnvelope&geometry={"xmin":6593024.93074,"ymin":10538006.4152,"xmax":6641944.62884,"ymax":10569039.8487,"spatialReference":{"wkid":102100}}&inSR=102100&spatialRel=esriSpatialRelIntersects&outSR=102100&outFields=*&f=pjson

говорит нам о том, что есть прямоугольник для которого надо найти все пересекающиеся сейсмопрофили. Эталонный ответ содержит 16 записей.

Запрос к PostGIS с оператором «&&» вернет 20 записей
select *, st_asgeojson(1, st_transform(geom::geometry, 3857)) shape
from seisprof
where geom::geometry && ST_transform(
        ST_GeomFromText(
            'POLYGON((6593024.93074 10538006.4152, 6641944.62884 10538006.4152, 6641944.62884 10569039.8487, 6593024.93074 10569039.8487, 6593024.93074 10538006.4152))'
            , 3857)
        , st_srid(geom::geometry) );
то есть найдет дополнительно 4 записи, боксы которых перекрывают заданный бокс, но сами сейсмопрофили находятся снаружи заданного прямоугольника. Зато очень быстро.

Правильный (зато более тормозной) запрос к PostGIS, возвращающий нужные 16 записей выглядит так
select *, st_asgeojson(1, st_transform(geom::geometry, 3857)) shape
from seisprof
where not st_disjoint(
    geom::geometry
    ,ST_transform(
        ST_GeomFromText(
            'POLYGON((6593024.93074 10538006.4152, 6641944.62884 10538006.4152, 6641944.62884 10569039.8487, 6593024.93074 10569039.8487, 6593024.93074 10538006.4152))'
            , 3857)
        , st_srid(geom::geometry) ) );
причем «not st_disjoint» можно заменить на «st_intersects», что одно и то же
Конечно, нельзя не упомянуть тот факт, что разница в быстродействии будет заметна только в том случае, если правильному запросу придется отсекать гораздо больше лишних записей, нежели 4.

Чуть не забыл, оператор PostGIS «&&» более всего похож на «esriSpatialRelEnvelopeIntersects» в ArcGIS.

original post http://vasnake.blogspot.com/2013/04/intersect-or-not-disjoint.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)