Kiedy definiujesz punkt w PostGIS, kiedy zdecydujesz się zastosować który z poniższych elementów?
ST_SetSRID(ST_MakePoint(lon,lat),4326)
ST_SetSRID(ST_Point(long,lat),4326)
ST_SetSRID(ST_GeomFromText('POINT(lon lat)',4326)
ST_GeomFromEWKT('SRID=4326;POINT(lon lat)')
Jeśli jest to zasadniczo różnica w wydajności, która będzie najszybsza?
postgis
postgresql
coordinate-system
Nyxynyx
źródło
źródło
Odpowiedzi:
Domyślam się, że
ST_MakePoint
jest to najszybszy, ale łatwo jest go porównać z 100 000 losowymi punktami.A oto niektóre wyniki z PostGIS 2.1 (trunk) na PostgreSQL 9.1, x64 Debian. Zrobiłem je kilka razy, aby uzyskać przybliżoną średnią. Oto
<POINT CONSTRUCTOR METHOD>
kolejność od najszybszej do najwolniejszej:ST_SetSRID(ST_MakePoint(random(), random()), 4326)
ST_GeomFromText('POINT(' || random()::text || ' ' || random()::text || ')', 4326)
ST_GeomFromEWKT('SRID=4326;POINT(' || random()::text || ' ' || random()::text || ')')
ST_GeomFromText
Wreszcie, wee przypis na temat różnicy między bezstratnymi / stratnymi konwersjami przy użyciu powyższych metod.
ST_MakePoint
Zachowuje tylko binarne dane precyzyjne zmiennoprzecinkowe, a konwersje tekstu obcinają bardzo małą część danych. Chociaż dwa punkty mogą mieć różnice binarne (widoczne w WKB), zawsze powinny być one przestrzennie równe. Różnice odległości są zasadniczo epsilon maszyny dla podwójnej precyzji .źródło
SQL
składni<POINT CONSTRUCTOR METHOD>
. Czy to tylko pseudokod, który odnosi się do czterech różnych podejść, czy też wykonujesz jakąś funkcję?1e-14
... Zmień tabelę f1,FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1
aby zobaczyć ją w psql.ST_MakePoint i ST_Point są takie same - oba wywołują LWGEOM_makepoint (można to zobaczyć w pliku postgis / postgis.sql.in w kodzie źródłowym). Użyłbym ST_MakePoint. Procedury konwersji tekstu dają ten sam wynik, ale są wolniejsze z powodu wymaganej ilości parsowania.
źródło
SRID 4326 i geometria
Na marginesie doskonałej, kompleksowej i aktualnej odpowiedzi MikeT . Wydaje się, że wiele osób zadaje to pytanie, ponieważ chce ustawić SRID w kolumnie POINT.
Ale kiedy to robią, mają problemy z najlepszą metodą tworzenia punktu, ale niestety wpadają w kłopoty.
Stamtąd uważają, że mają dwie opcje
ST_SetSRID( ST_MakePoint(1,2) )
co jest najbardziej prawe, ale kruche, lubST_GeomFromText
, jest to logicznie wolniejsze i nie wymaga testów porównawczych: PostgreSQL musi przeanalizować argumenty konstruktora z tekstu. Sam też jest wyjątkowo brzydki.Niestety, istnieje inny sposób.
Typ geograficzny
Domyślny SRID dla
geography
to 4326. Jeśli jesteś nowy, sugeruję użyciegeography
zamiastgeometry
. W zasadzie, jeśli nie znasz różnicy, której prawdopodobnie chceszgeography
. Możesz łatwo przełączać kolumny.Teraz wstawianie jest łatwiejsze, ponieważ typ jest już domyślnie powiązany z SRID 4326. Teraz możesz jawnie rzutować na
geography
, lub po prostu pozwolić, aby rzutowanie niejawne działałoKtóry wygląda tak (wszystkie wstawiają tę samą rzecz)
Konwersja na tekst, a następnie zmuszanie PostgreSQL do parsowania tekstu za pomocą
ST_GeomFromText
lubST_GeogFromText
jest głupie i powolne.źródło