পোস্টজিআইএস দিয়ে আমি ম্যানহাটনের দূরত্ব কীভাবে গণনা করব?


9

দুটি জ্যামিতির (একটি ট্রেন স্টেশন এবং একটি বিল্ডিং) মধ্যকার দূরত্ব গণনা করার জন্য আমি ST_Distance ফাংশনটি ব্যবহার করছি যেহেতু আমি জানি যে সমস্ত বিল্ডিং এবং সমস্ত ট্রেন স্টেশন শিকাগোতে রয়েছে, যার একটি দুর্দান্ত / সম্পূর্ণ স্ট্রিট গ্রিড রয়েছে, তাই আমি ম্যানহাটন ব্যবহার করতে চাই (বা ট্যাক্সিক্যাব) দূরত্ব

এর জেনেরিক সূত্রটি হ'ল এক্স এর পার্থক্য এবং ওয়াইয়ের পার্থক্য, সুতরাং অ্যাবস (এক্স 1-এক্স 2) + অ্যাবস (ওয়াই 1-ওয়াই 2)।

PostgreSQL কোয়েরিটি এই কাজটি করে?


1
এখানে একটি চটজলদি চিন্তা: আপনার গ্রিড 'x' এবং 'y' সমবায় সিস্টেমের 'x' এবং 'y' এর সাথে আবশ্যক নয়। সুতরাং উপাদানগুলি বের করে নেওয়ার আগে আপনাকে ভেক্টরটি ঘোরানোর প্রয়োজন হতে পারে।
ক্রেগ রিঞ্জার

@ ক্রেইগ্রিঞ্জার আমি স্থানীয়ভাবে প্রচলিত প্রক্ষেপণ, ইপিএসজি 3435, ইলিনয় স্টেটপ্ল্যান পূর্ব পাদদেশগুলিতে স্থানাঙ্কগুলি রূপান্তর করি। এটি শিকাগো সিটি এর সমস্ত জিআইএস কাজের জন্য ব্যবহার করে। আমি গুগল ম্যাপের হাঁটার দূরত্ব গণনা ব্যবহার করে কিছু বৈধতা দিয়ে আমার নিজের প্রশ্নের উত্তর দিয়েছি।
স্টিভান্স 16

1
আপনি কি নিজের পোস্টজিআইএস ডেটা পিজিআরটিং মডিউল দিয়ে প্রসারিত এবং এটি অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করার বিষয়টি বিবেচনা করেছেন? দৃশ্যত এ * পদ্ধতিতে অনুরূপ কিছু ব্যবহার করা হয়েছে
রায়ানকডালটন

@ রায়ানডাল্টন আমি আমার অন্য প্রকল্পের জন্য পিজারাউটিং ব্যবহার করার বিষয়টি বিবেচনা করেছি তবে এই প্রকল্পের জন্য একটি স্থাপনের ঝামেলা বেশি সঠিক ফলাফল বা রুট গণনা করার জন্য সংস্থান ব্যয়ের পক্ষে মূল্যহীন নয়।
স্টিভান্স 16

উত্তর:


6

আমি প্রস্তাবিত প্রশ্নের সাথে আমার নিজের প্রশ্নের উত্তর দিচ্ছি।

select *, ABS(x_permit-x_station)+ABS(y_permit-y_station) as manhattan FROM (SELECT
longname AS NAME,
lines AS metadata,
T .slug,
ST_Distance (
    T .geom,
    ST_Transform (P .geometry, 3435)
) AS distance, 
ST_X(ST_Transform(p.geometry, 3435)) as x_permit,
ST_Y(ST_Transform(p.geometry, 3435)) as y_permit,
ST_X(t.geom) as x_station,
ST_Y(t.geom) as y_station
FROM
permits P,
stations_cta T
WHERE
P .permit_ = '100533644'
ORDER BY
distance
LIMIT 2) as foo

নীচে এই ফলাফলগুলি কয়েকটি কলাম বাদ পড়েছে:

Kedzie-Ravenswood   Brown Line  3738.52830193659    3796.29623843171
Addison-O'Hare  Blue Line   4105.37381385087    5790.20002649655

প্রথম সংখ্যাযুক্ত কলামটি হ'ল দূরত্ব (পাদদেশে, কারণ আমি EPSG 3435 ব্যবহার করছি) ST_Distance PostGIS ফাংশন দ্বারা গণনা করা হয় এবং দ্বিতীয় নম্বরযুক্ত কলামটি ম্যানহাটনের দূরত্বের সূত্রের ফলাফল।

আমি দ্বিতীয় ফলাফলটি স্পট-চেক করে অ্যাডিসন ব্লু লাইন সিটিএ স্টেশন এবং 3226 ডাব্লু বেল প্লেইন অ্যাভে-তে বিল্ডিংয়ের মধ্যে গুগল ম্যাপ থেকে হাঁটার দূরত্ব পেয়েছি (ক্যোয়ারীতে '100533644' হিসাবে চিহ্নিত)। গুগল ম্যাপস ১.১ মাইল হেঁটে যাওয়ার পথে আউটপুট দেয় যখন পোস্টগ্রিসের ফলাফল ৫,,৯০ ফুট = 1.09 মাইল। পার্থক্যটি আমার উদ্দেশ্যে গ্রহণযোগ্য।


1
এটি দুর্দান্ত -
ডিপিএসএসপিশিয়াল

@ ম্যাপবেকার ধন্যবাদ! pgRouting আমার সাধারণ গণিতের প্রয়োজনের জন্য খুব জটিল।
স্টিভান্স

3

আমি মনে করি আমি আরও কিছুটা মার্জিত সমাধানও পেয়েছি যা ট্রিগনোমেট্রি এবং বিল্ট ইন ST_Azimuthফাংশন ব্যবহার করে এবং এটিকে একটি সুন্দর ফাংশনে আবদ্ধ করে:

CREATE OR REPLACE FUNCTION JZ_TaxiCab(p1 geometry, p2 geometry)
RETURNS REAL AS $$
DECLARE 
    az REAL;
    h REAL;
BEGIN
    az := ST_Azimuth(p1, p2);
    /* Cast to geography to get result in meters */
    h := ST_Distance(p1::geography, p2::geography);
    /*   Note: we have to take abs() because the values returned by
         can be positive or negative. We really don't necessarily care
         about the reference point since it's going to be a right triangle.
    */
    RETURN h * abs(sin(az)) + h * abs(cos(az));
END;
$$  LANGUAGE plpgsql
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.