পোস্টজিআইএস-এ সবচেয়ে কাছের জ্যামিতি সন্ধান করা


16

আমি ফাংশনগুলির পোস্টজিআইএস "এপিআই" সন্ধান করছি এবং আমি লক্ষ্য করেছি যে তাদের বেশিরভাগের তুলনা করতে দুটি উপাদান লাগে। উদাহরণস্বরূপ, ST_Distance ফাংশনটি দূরত্বটি খুঁজতে দুটি জ্যামিতি / ভূগোল উপাদান গ্রহণ করে।

এখানে কিছু করার মতো কোনও কাজ নেই: "জ্যামিতি জি দেওয়া হয়েছে, আমাকে টেবিল টিতে সবচেয়ে কাছের জ্যামিতি GClosest দিন যেখানে G.id <> GClosest.id"

আমি বুঝতে পেরেছি যে টেবিলের উপরে পুনরাবৃত্তি করতে এবং প্রতিটি উপাদানকে ST_Distance কল করতে আমি একটি PL / PgSQL ফাংশন লিখতে পারি, তবে আমি আশা করছি এর থেকে আরও ভাল, আরও দক্ষ, সমাধান হবে।


1
আপনি যদি নিকটতম জ্যামিতির দূরত্বের বিষয়ে আগ্রহী হন, gis.stackexchange.com/questions/11979/…
আন্ডার ডার্ক

আমি যদি সঠিকভাবে বুঝতে পারি তবে আমাকে জানতে দিন ... আপনি পরবর্তী বৈশিষ্ট্যটি চান যা সবচেয়ে কাছের চেয়ে একই দূরত্ব রয়েছে?
ফ্যালাকাচিবার

উত্তর:


7

আপনার প্রশ্নের উত্তর নীচের মতো একটি একক (জটিল হলেও) ক্যোয়ারী দ্বারা উত্তর দেওয়া যেতে পারে যা পুরো রেকর্ড এবং রেফারেন্স জ্যামিতির দূরত্ব ফিরিয়ে দেয়। দয়া করে মনে রাখবেন যে যদি একাধিক রেকর্ড ন্যূনতম দূরত্বের সাথে মেলে তবে তারা সবাই ফিরে আসবে।

SELECT 
  i.*,
  md.min_distance
FROM
  address AS i, 
  (SELECT 
     ga.address_geom,
     min( ST_Distance(
            ga.address_geom,
            gb.address_geom)
        ) AS min_distance
   FROM
     address AS ga,
     address AS gb 
   WHERE 
     ga.id <> gb.id 
   AND 
     ga.id = 3
   GROUP BY 
     ga.address_geom
  ) AS md 
WHERE 
  ST_Distance( i.address_geom, md.address_geom) = md.min_distance;

আমি এই সন্ধানের ঠিকানাগুলির টেবিলটিতে পরীক্ষা করেছি এবং এটি কার্যকর হয়। উপরের ক্যোয়ারিতে আমি আইডি = 3 দিয়ে নিকটতম পয়েন্টটি সন্ধান করছি।


এটি ভাল তথ্য - আপনাকে ধন্যবাদ ... আমি সংজ্ঞা অনুসারে সর্বনিম্ন (..) মোট কার্যকারিতাটি বুঝতে পেরেছি, তবে এটি আপনার উদাহরণে কীভাবে ব্যবহৃত হচ্ছে তা নিয়ে আমি বিভ্রান্ত। st_distance (X, Y) দুটি জ্যামিতির ধরণ নেয় এবং তাদের মধ্যে একটি দূরত্ব দেয় যা একক মান। আপনি কেন সেই একক মান ফলাফলের উপর একটি সামগ্রিক ফাংশন বলছেন? হতে পারে আমি অভ্যন্তরীণ নির্বাচনের বিবৃতিটি ভুল ব্যাখ্যা করছি ...
Jmoney38

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

দুর্ভাগ্যক্রমে উইন্ডো ফাংশনগুলি 8.4 তে প্রবর্তিত হয়েছিল এবং এখন আমার কাছে এমন একটি সার্ভারে অ্যাক্সেস নেই যা পোস্টগ্রিস এবং সেই সংস্করণ উভয়ই রয়েছে তাই আমি পার্টশনের ধারাটির সাথে পুনর্লিখনিত কোনও প্রশ্নের পরীক্ষা করতে পারি না।
ইউনিকোলেটি

7

জর্জ ম্যাকেরন একটি সহজ নিকটবর্তী নেবার ফাংশন লিখেছেন যা আমি বেশ দরকারী বলে মনে করেছি। এই ফাংশনটি প্রদত্ত বৈশিষ্ট্যে নিকটতম প্রতিবেশীর আইডি ফিরিয়ে দেয়:

create or replace function 
  nn(nearTo                   geometry
   , initialDistance          real
   , distanceMultiplier       real 
   , maxPower                 integer
   , nearThings               text
   , nearThingsIdField        text
   , nearThingsGeometryField  text)
 returns integer as $$
declare 
  sql     text;
  result  integer;
begin
  sql := ' select ' || quote_ident(nearThingsIdField) 
      || ' from '   || quote_ident(nearThings)
      || ' where st_dwithin($1, ' 
      ||   quote_ident(nearThingsGeometryField) || ', $2 * ($3 ^ $4))'
      || ' order by st_distance($1, ' || quote_ident(nearThingsGeometryField) || ')'
      || ' limit 1';
  for i in 0..maxPower loop
     execute sql into result using nearTo              -- $1
                                , initialDistance     -- $2
                                , distanceMultiplier  -- $3
                                , i;                  -- $4
    if result is not null then return result; end if;
  end loop;
  return null;
end
$$ language 'plpgsql' stable;

ব্যবহারের উদাহরণ:

SELECT id, nn(pt_geom,0.00001,2,100,'nw_node','node_id','node_geom') FROM my_point_table;

... আমার_পয়েন্ট_ট্যাবেলে প্রতিটি প্রবেশের জন্য nw_node টেবিলের নিকটতম নোডটি নির্বাচন করে।

এখানে একটা হল বস্টন জিআইএস সাইটে আরও জেনেরিক ফাংশন


প্রশ্নগুলি কীভাবে তৈরি করা যায় সে সম্পর্কে আমি আরও উদ্বিগ্ন: আরও সাধারণ অর্থে এন ক্যোরিগুলি। উদাহরণস্বরূপ, জ্যামিতি জি এর নিকটতম উপাদানটি সন্ধান করার পরিবর্তে, আমি প্রথম উপাদানটি খুঁজে পেতে চাই যা জিকে ওভারল্যাপ করে। তথ্যের জন্য আপনাকে ধন্যবাদ, নির্বিশেষে। বোস্টন জিআইএস-এর লিঙ্কটি খুব কার্যকর ছিল! আমি ইতিমধ্যে কিছু চিট শীট মুদ্রণ করেছি :-)
Jmoney38

আপনার প্রশ্নটি একটু পরিষ্কার করার জন্য আপনি জবাব দিতে পারেন, @ জিমনি 48 oney সুতরাং আপনি বিশেষত নিকটবর্তী প্রতিবেশী সমস্যার প্রতি আগ্রহী নন বরং কোনও টেবিলে সমস্ত জ্যামিতির সাথে একটি জ্যামিতির তুলনা কীভাবে করবেন?
আন্ডার ডার্ক

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