পোস্টজিআইএস-এ পয়েন্ট তৈরি করার জন্য কোন কাজ?


30

পোস্টজিআইএস-এ কোনও পয়েন্ট নির্ধারণ করার সময়, আপনি নীচের কোনটি ব্যবহার করবেন?

  • 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)')

এটির মূলত পারফরম্যান্সের পার্থক্য থাকলে, কোনটি দ্রুত হবে?


এই উত্তরটি দেখুন: gis.stackexchange.com/a/285017/6052
ইভান ক্যারল

উত্তর:


26

আমার অনুমান যে ST_MakePointএটি সবচেয়ে দ্রুত, তবে এটি 100k এলোমেলো পয়েন্ট সহ বেঞ্চমার্কের পক্ষে যথেষ্ট সহজ।

\timing

WITH test AS (
  SELECT <POINT CONSTRUCTOR METHOD>
  FROM generate_series(1,100000)
)
SELECT count(*) FROM test;

পোস্টগ্রিসএসকিউএল 9.1, এক্স 64 ডিবিয়ান-এ পোস্টজিআইএস 2.1 (ট্রাঙ্ক) সহ কিছু ফলাফল রয়েছে। আনুমানিক গড় পেতে আমি কয়েকবার সেগুলি করেছি। এখানে <POINT CONSTRUCTOR METHOD>অনুক্রমে দ্রুততম থেকে ধীরতম করুন:

  1. ST_SetSRID(ST_MakePoint(random(), random()), 4326)
    • গড় 160 এমএস
    • সবচেয়ে দ্রুততম দ্বারা, এবং ডাবল-পয়েন্ট যথার্থতা সংরক্ষণ করে (ক্ষতিহীন)
    • সংখ্যাগত স্থানাঙ্ক ডেটা দিয়ে প্যারামিটারাইজড ক্যোয়ারী তৈরি করার সহজ উপায়
  2. ST_GeomFromText('POINT(' || random()::text || ' ' || random()::text || ')', 4326)
    • গড় 760 এমএস
    • ধীরে ধীরে, সংখ্যাটি পাঠ্য হিসাবে প্রেরণ করা হয়, তারপরে স্ট্রিংটি একত্রে পাইস করা হয়, তারপরে পোস্টজিআইএসকে সংখ্যাগুলি অনুসন্ধান করার জন্য এটি বিশ্লেষণ করতে হবে
    • ক্ষতির, সংখ্যার কারণে -> পাঠ্য -> নম্বর রূপান্তর
  3. ST_GeomFromEWKT('SRID=4326;POINT(' || random()::text || ' ' || random()::text || ')')
    • গড় 810 এমএস
    • সবচেয়ে ধীর, নিশ্চিত নয় কেন এটি তার চেয়ে ধীর ST_GeomFromText

শেষ অবধি, উপরোক্ত পদ্ধতির সাথে ক্ষয়ক্ষতিহীন / ক্ষতিগ্রস্ত রূপান্তরগুলির মধ্যে পার্থক্যের উপর একটি ছোট পাদটীকা। কেবল ST_MakePointবাইনারি ভাসমান পয়েন্ট নির্ভুলতা ডেটা সংরক্ষণ করে এবং পাঠ্য রূপান্তরগুলি ডেটাটির খুব সামান্য অংশ কেটে দেয়। যদিও দুটি পয়েন্টের বাইনারি পার্থক্য থাকতে পারে (ডাব্লুকেবিতে দেখা যায়) তবে এগুলি সর্বদা স্থানিক সমান হওয়া উচিত। দূরত্বের পার্থক্যগুলি মূলত ডাবল যথার্থতার জন্য মেশিনের অ্যাপসিলন

SELECT
  (geom_text = geom_binary) AS spatially_equal,
  (geom_text::text = geom_binary::text) AS binary_equal,
  (ST_AsText(geom_text) = ST_AsText(geom_binary)) AS wkt_equal,
  ST_Distance(geom_text, geom_binary)
FROM (
  SELECT x, y,
    ST_GeomFromText('POINT(' || x::text || ' ' || y::text || ')') AS geom_text,
    ST_MakePoint(x, y) AS geom_binary
  FROM (SELECT random()::float8 as x, random()::float8 as y) AS f1
) AS f2;

 spatially_equal | binary_equal | wkt_equal |     st_distance
-----------------+--------------+-----------+----------------------
 t               | f            | t         | 1.38777878078145e-16

1
এটি কীভাবে গণনা করা যায় সে সম্পর্কে দুর্দান্ত ব্যাখ্যার জন্য ধন্যবাদ। আমি SQLসিনট্যাক্স সম্পর্কে আগ্রহী <POINT CONSTRUCTOR METHOD>,। চারটি ভিন্ন পদ্ধতির উল্লেখ করার জন্যই কি এটি সিউডোকোড, বা আপনি কোনও ধরণের ফাংশন করছেন?
djq

2
@ ডিজেকি হ্যাঁ, এটি 1, 2 এবং 3 এ প্রকৃত এসকিউএল কোডের জন্য কেবল স্থানধারক
মাইক টি

রেফারেন্স হিসাবে ব্যবহার করতে ভাসমান ডেটাটাইপের যথাযথ সীমা সম্পর্কে বিস্তারিত ... মেশিনের অ্যাপসিলনটি হ'ল 1e-14... FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1আপনার পিএসকিএল এ দেখতে f1 টেবিলটি পরিবর্তন করুন।
পিটার ক্রাউস

5

ST_MakePoint এবং ST_Point একই - তারা উভয়ই LWGEOM_makePoint কল করে (আপনি উত্স কোডের পোস্টগ্রিস / পোস্টগিস.সকিএল.ইন. ফাইলটিতে এটি দেখতে পারেন)। আমি ST_MakePoint ব্যবহার করব। পাঠ্য রূপান্তর রুটিনগুলি একই ফল দেয় তবে প্রয়োজনীয় পার্সিংয়ের পরিমাণ ধীর হয়ে যায়।


1

এসআরআইডি 4326 এবং জ্যামিতি

মাইকেটির দুর্দান্ত, বিস্তৃত এবং বর্তমান উত্তরের সাইড নোট হিসাবে । অনেক লোক এই প্রশ্নটি জিজ্ঞাসা করছে বলে মনে হচ্ছে কারণ তারা একটি পয়েন্ট কলামে এসআরআইডি সেট করতে চায়।

CREATE TABLE foo ( geom geometry(Point,4326) );

তবে তারা যখন সমস্যাটি তৈরি করে তখন পয়েন্ট তৈরির সর্বোত্তম পদ্ধতির মতো মনে হয় তবে হায় হায় তারা সমস্যার মধ্যে পড়ে।

INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR:  Geometry SRID (0) does not match column SRID (4326);

সেখান থেকে, তারা কারণ দুটি কারণ আছে

  • এসআরআইডি ম্যানুয়ালি সেট করুন, ST_SetSRID( ST_MakePoint(1,2) ) যা ডান দিকের রাস্তা তবে ক্রুফটি বা
  • ব্যবহার করে পাঠ্যটি তৈরি করুন ST_GeomFromText, এটি যৌক্তিকভাবে ধীর এবং এর জন্য বেনমার্কের প্রয়োজন নেই: পোস্টগ্রেএসকিউএলকে পাঠ্য থেকে নির্মাণকারীর যুক্তিগুলি পার্স করতে হবে। এটি নিজেও অত্যন্ত কুরুচিপূর্ণ।

হায়, অন্য উপায় আছে।

ভূগোল প্রকার

এর জন্য ডিফল্ট এসআরআইডি geography4326। আপনি যদি নতুন হন তবে আমি এর geographyপরিবর্তে ব্যবহারের পরামর্শ দেব geometry। আসলে, সাধারণত যদি আপনি সম্ভবত যে পার্থক্যটি চান তা জানেন না geography। আপনি কলামগুলি খুব সহজেই স্যুইচ করতে পারেন।

BEGIN;
  ALTER TABLE foo ADD COLUMN geog geography(point,4326);
  UPDATE foo SET geog = geom::geography;
  ALTER TABLE foo DROP COLUMN geom;
COMMIT;

এখন সন্নিবেশ আরও সহজ কারণ টাইপটি ইতিমধ্যে SRID 4326 এর সাথে ডিফল্ট-সম্পর্কিত Now এখন আপনি স্পষ্টভাবে কাস্ট করতে পারেন geography, বা কেবল অন্তর্নিহিত cast ালাইকে কাজ করতে দিন

ST_MakePoint(x,y)                     -- implicit cast and srid
ST_MakePoint(x,y)::geography          -- explicit cast, implicit srid
ST_SetSRID( ST_MakePoint(3,4), 4326 ) -- explicit cast and srid

যা দেখতে এটির মতো দেখাচ্ছে (তারা সকলেই একই জিনিস সন্নিবেশ করায়)

INSERT INTO foo (geog) VALUES
  -- implicit cast and SRID
  ( ST_MakePoint(1,2) ),

  -- explicit cast, implicit SRID
  ( ST_MakePoint(1,2)::geography ),

   -- explicit cast and SRID
  ( ST_SetSRID( ST_MakePoint(3,4), 4326 )::geography );

পাঠ্যে রূপান্তর করা এবং তারপরে পোস্টগ্র্রেএসকিউএলকে পাঠ্যের সাথে পার্স করতে ST_GeomFromTextবা ST_GeogFromTextনির্বোধ এবং ধীর গতিতে বাধ্য করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.