Когда вы определяете точку в PostGIS, когда вы решаете использовать что из следующего?
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)')
Если это существенно разница в производительности, что будет самым быстрым?
postgis
postgresql
coordinate-system
Nyxynyx
источник
источник
Ответы:
Я предполагаю, что
ST_MakePoint
это самый быстрый, но это достаточно легко для сравнения с 100k случайных точек.И вот некоторые результаты с PostGIS 2.1 (транк) на PostgreSQL 9.1, x64 Debian. Я сделал их несколько раз, чтобы получить приблизительное среднее. Вот
<POINT CONSTRUCTOR METHOD>
порядок от самого быстрого до самого медленного: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
И, наконец, небольшая сноска о разнице между конверсиями без потерь / с потерями с помощью вышеуказанных методов.
ST_MakePoint
Сохраняет только двоичные данные с плавающей запятой, а преобразования текста обрезают очень небольшую часть данных. Хотя эти две точки могут иметь двоичные различия (видно в WKB), они всегда должны быть пространственно равными. Различия в расстояниях - это, по сути, машина эпсилон для двойной точности .источник
SQL
синтаксиса<POINT CONSTRUCTOR METHOD>
. Это просто псевдокод для обозначения четырех разных подходов, или вы выполняете какую-то функцию?1e-14
... Измените таблицу f1,FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1
чтобы увидеть ее в psql.ST_MakePoint и ST_Point одинаковы - оба они вызывают LWGEOM_makepoint (вы можете увидеть это в файле postgis / postgis.sql.in в исходном коде). Я бы использовал ST_MakePoint. Процедуры преобразования текста дают тот же результат, но медленнее из-за необходимого количества синтаксического анализа.
источник
SRID 4326 и геометрия
В качестве примечания к отличному, всеобъемлющему и актуальному ответу MikeT . Многие люди задаются этим вопросом, потому что хотят установить SRID в столбце POINT.
Но когда они это делают, у них возникают проблемы с тем, что кажется лучшим способом создания точки, но, увы, они сталкиваются с проблемами.
Оттуда они думают, что у них есть два варианта
ST_SetSRID( ST_MakePoint(1,2) )
что является самым правильным способом, но хитрым, илиST_GeomFromText
, это логически медленнее и не требует тестов: PostgreSQL должен анализировать аргументы конструктора из текста. Это также чрезвычайно уродливо само по себе.Увы, есть и другой путь.
Тип географии
SRID по умолчанию для
geography
4326. Если вы новичок, я бы предложил использоватьgeography
вместоgeometry
. На самом деле, как правило, если вы не знаете разницу, которую вы, вероятно, хотитеgeography
. Вы можете легко переключать столбцы.Теперь вставка стала проще, потому что тип уже связан по умолчанию с SRID 4326. Теперь вы можете явно приводить к
geography
или просто позволить неявному приведению работатьКоторый выглядит так, (они все вставляют одно и то же)
Преобразование в текст, а затем принуждение PostgreSQL к анализу текста с
ST_GeomFromText
илиST_GeogFromText
глупо и медленно.источник