পোস্টজিআইএস জ্যামিতি ক্যোয়ারী "ত্রুটি: মিশ্র এসআরআইডি জ্যামিতিগুলির উপর অপারেশন" কেবলমাত্র নির্দিষ্ট মানগুলির জন্য দেয়


17

আমার দুটি জ্যামিতি কলাম সহ পোস্টজিআইএস টেবিল রয়েছে, দুটিই এসআরআইডি 4326 দিয়ে সংজ্ঞায়িত করা হয়েছে I আমি নীচের INSERTবিবৃতিটি ব্যবহার করে টেবিলে problemোকাতে পারি (যেখানে lngএবং latপ্রোগ্রামাগুলিতে মানগুলি পাস হয়েছে):

INSERT INTO pad_meta (
    uuid, created, updated, name, origin, radius, area, expiry, creator
) VALUES (
    $1, now(), now(), $2, ST_GeomFromText('POINT(lng, lat)', 4326), $3, 
    ST_Buffer(ST_GeomFromText('POINT(lng, lat)', 4326), $4), $5, $6
)

তবে আমি যখন পাব তার মানটির উপর নির্ভর করে ST_Intersects ব্যবহার করে ছেদ করার জন্য জিজ্ঞাসা করি ERROR: Operation on mixed SRID geometries

উদাহরণস্বরূপ, এই কোয়েরিটি কাজ করে:

SELECT * FROM pad_meta where ST_Intersects(
    'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry 
) ORDER BY created DESC;

এবং এই ত্রুটিগুলি আউট:

SELECT * FROM pad_meta where ST_Intersects(
    'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry 
) ORDER BY created DESC;

দ্রষ্টব্য, দ্রাঘিমাংশের মান বাদে এগুলি অভিন্ন প্রশ্ন। আমি বিভিন্ন মান নিয়ে পরীক্ষা-নিরীক্ষা করেছি, কিন্তু যে প্রশ্নের কাজ করে এবং কী করে না তার মধ্যে একটি স্পষ্ট রূপান্তর পয়েন্ট চিহ্নিত করতে পারিনি।

আমি মনে করি আমি মূলত কিছু ভুল বুঝছি tanding এই মুহুর্তের জন্য, ST_GeomFromTextএসআরআইডিটি ব্যবহার করতে এবং স্পষ্টভাবে উল্লেখ করে পুনরায় ফর্ম্যাট করে সমস্যার সমাধান / সংশোধন / কাজ করেছি:

SELECT * FROM pad_meta where ST_Intersects(
    ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;

তবে আমি সত্যিই পার্থক্যটি কী তা সত্য তা বুঝতে পারি না, বা যদি এটি সত্যই "সমাধান" হয়।

আমার প্রশ্নটি হল: কেন আমি কেবল নির্দিষ্ট মানগুলির জন্য ত্রুটি পাচ্ছি এবং এই কোয়েরিকে বিন্যাস করার উপযুক্ত উপায় কী?

এখানে রেফারেন্সের জন্য আমার সারণির সংজ্ঞা দেওয়া আছে:

CREATE TABLE IF NOT EXISTS pad_meta (
  uuid CHAR(32),
  created TIMESTAMP,
  updated TIMESTAMP,
  name VARCHAR(128),
  origin GEOMETRY(Point, 4326),
  radius INTEGER,
  area GEOMETRY(Polygon, 4326),
  expiry TIMESTAMP,
  creator CHAR(32),
  PRIMARY KEY (uuid)
);

আমি এটিও যাচাই করেছি যে জ্যামিতি_কলামগুলিতে কেবলমাত্র এক ধরণের এসআরআইডি রয়েছে:

SELECT f_table_name, f_geometry_column, srid FROM geometry_columns;
f_table_name | f_geometry_column | srid
--------------+-------------------+------
 pad_meta     | origin            | 4326
 pad_meta     | area              | 4326

সহায়তা / পরামর্শ প্রশংসা ধন্যবাদ! (দ্রষ্টব্য: আমি এই প্রশ্নটিও দেখেছি , তবে যেহেতু আমি ইতিমধ্যে স্পষ্টভাবে আমার জ্যামিতি এসআরআইডিগুলি টেবিলের মধ্যে সন্নিবেশ করানোর সময় সংজ্ঞায়িত করছি তাই মনে হচ্ছে যা ঘটছে তা নয় is)

উত্তর:


24

আপনি যখন কোনও এসআরআইডি ছাড়াই জ্যামিতি নির্দিষ্ট করেন, এটি আসলে 0(বা -1সংস্করণ <2 এর জন্য):

SELECT ST_SRID('POINT(-122.334172173172 46.602634395263560)'::geometry);
 st_srid
---------
       0

সুতরাং যখন আপনি এই জ্যামিতিটি অন্য একটিতে এসআরআইডি = 4326 এর সাথে ব্যবহার করেন, এটি মিশ্রিত হয় 0এবং 4326। এটি সাধারণত একটি দরকারী ত্রুটি, যদি স্থানিক উল্লেখগুলি সত্যই আলাদা হয়। আপনার ক্ষেত্রে, এসআরআইডিগুলি একই, তবে আপনি এসআরআইডিটিকে কোয়েরি পয়েন্টে এনকোড করেননি। সুতরাং, আপনার কোয়েরিটি ঠিক করার জন্য সর্বদা আপনার কোয়েরি পয়েন্টের জন্য একই এসআরডিডি নির্দিষ্ট করুন এবং সেগুলি আর মিশ্রিত হবে না।

একটি সাইড নোট হিসাবে, টাইপ হিসাবে এখানে দেখানো, 4326 একটি ডিফল্ট SRID (WGS 84) আছে:geography

SELECT ST_SRID('POINT(-122.334172173172 46.602634395263560)'::geography::geometry);
 st_srid
---------
    4326

সুতরাং, আপনি যদি geographyপ্রকারের পরিবর্তে প্রকারগুলি ব্যবহার geometryকরেন তবে এসআরআইডি নির্দিষ্ট করার দরকার নেই (আপনি যদি মঙ্গল গ্রহের জন্য বিকল্প উপবৃত্তাকার জন্য বা অন্য যাই হোক না কেন আলাদা এসআরআইডি না চান)।


কেন একটি ক্যোয়ারিতে ত্রুটি রয়েছে এবং অন্যটি তা না ST_Intersectsকরে প্রথমে একটি &&বাউন্ডিং বাক্স অনুসন্ধান করে যা দ্রুত, এবং এসআরআইডিগুলিকে যত্ন করে না। সীমানা বাক্সগুলি ছেদ না করা থাকলে কোনও মিশ্রিত এসআরআইডি ত্রুটি বার্তা উত্থাপিত হবে না। তবে যদি তারা ছেদ করে, দ্বিতীয় ফিল্টারটি _ST_Intersectsযা আরও সুনির্দিষ্ট এবং দুটি এসআরআইডি মিলছে কিনা তা নিশ্চিত করে পরীক্ষা করে এবং মিশ্রিত হলে একটি ত্রুটি উত্থাপন করে। উদাহরণ স্বরূপ:

WITH pad_meta AS (
    SELECT 'SRID=4326;POLYGON((-124 50, -124 47, -121 50, -124 50))'::geometry AS area)

SELECT * FROM pad_meta where ST_Intersects(
    'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry 
);

কোনও ছেদযুক্ত বাউন্ডিং বাক্স এবং বাইপাস নেই _ST_Intersects। তবে POINT(-122.334172173172 47.602634395263560)ত্রুটি বাড়িয়ে তুলবে কারণ সীমানা বাক্সগুলি ওভারল্যাপ করে (যদিও জ্যামিতিগুলি আসলে ছেদ করে না)।

তবে একই জ্যামিতি এবং বিভিন্ন ফিল্টার সহ:

WITH pad_meta AS (
    SELECT 'SRID=4326;POLYGON((-124 50, -124 47, -121 50, -124 50))'::geometry AS area)

SELECT * FROM pad_meta where _ST_Intersects(
    'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry 
);

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


ওহ! ধন্যবাদ. এটা বোধগম্য. SRID=4326বাকি বিবৃতিটির জন্য এসআরআইডি সেট করার সঠিক উপায়ে (যেমন আপনি উপরে করেছেন) দিয়ে কোনও প্রশ্নের সাথে উপসর্গ করছেন? ( ST_GeomFromTextকেবলমাত্র এসআরআইডি নির্দিষ্ট করার জন্য আমি জানতাম না বলেই এর বিপরীতে ...?) প্রশ্নের জন্য ডিফল্ট এসআরআইডি সেট করার কোনও উপায় আছে কি? বরং প্রতিটি বার স্পষ্টভাবে সেট করা ভার্জোজ মনে হচ্ছে। আবার, ধন্যবাদ!
jessykate

1
আমি geographyটাইপগুলি ব্যবহার করার পরামর্শ দেওয়ার জন্য আমার উত্তর আপডেট করেছি , যা সর্বদা 4326 থাকে Also এছাড়াও, এসআরআইডি নির্দিষ্ট করার বিভিন্ন উপায় রয়েছে।
মাইক টি

0

সহায়তা করতে পারে এমন কয়েকটি পর্যবেক্ষণ: এক, Point(Double, Double)আপনি একটি পোস্টজিআইএস ডেটা টাইপের প্রতি জবরদস্তি করছেন এমন একটি নেটিভ পোস্টগ্রিজ এসকিউএল ফাংশন। ST_MakePoint(double x, double y)সঠিক জ্যামিতি তৈরি করবে will এছাড়াও, আপনার প্রশ্নে আপনি দ্বিতীয় তর্কটি দ্রাঘিমাংশ হিসাবে উল্লেখ করেছেন বলে মনে হচ্ছে। সঠিক অর্ডার x, yযা অনুরূপ, Longitude, Latitude। এই বিপরীতগুলি পাওয়া কোনও ব্যতিক্রম ছাড়াই অপ্রত্যাশিত ফলাফল ফিরে আসতে পারে।

এগুলির কিছুই সত্যিই ব্যাখ্যা করে না কেন আপনার প্রথম উদাহরণটি কখনও কখনও এবং অন্যদের জন্যও কাজ করে না তবে আশা করি এটি আপনাকে ভাল প্রশ্ন তৈরি করতে সহায়তা করবে।

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