मैं PostGIS के साथ मैनहट्टन की दूरी की गणना कैसे करूं?


9

मैं दो ज्यामितीयों (एक ट्रेन स्टेशन और एक इमारत) के बीच की दूरी की गणना करने के लिए ST_Distance फ़ंक्शन का उपयोग कर रहा हूं क्योंकि मुझे पता है कि सभी इमारतें और सभी ट्रेन स्टेशन शिकागो में हैं, जिसमें एक उत्कृष्ट / पूर्ण सड़क ग्रिड है, मैं मानसून का उपयोग करना चाहूंगा (या टैक्सीसेब) दूरी

इसके लिए जेनेरिक सूत्र X प्लस में अंतर Y है, इसलिए Abs (X1-X2) + Abs (Y1-Y2) में अंतर है।

PostgreSQL क्वेरी क्या यह काम करेगी?


1
यहाँ एक त्वरित विचार: आपका ग्रिड 'x' और 'y' आवश्यक रूप से समन्वय प्रणाली के 'x' और 'y' के साथ संरेखित नहीं है। तो आपको घटकों को निकालने और गणना करने से पहले वेक्टर को घुमाने की आवश्यकता हो सकती है।
क्रेग रिंगर

@ क्रैगरिंगर I निर्देशांक को स्थानीय रूप से प्रचलित प्रक्षेपण, EPSG 3435, इलिनोइस स्टेटप्लेन ईस्ट फीट में बदल देता है। इसका उपयोग शिकागो शहर द्वारा अपने सभी जीआईएस कार्यों के लिए किया जाता है। मैंने Google मैप्स की दूरी की गणना का उपयोग करते हुए कुछ सत्यापन के साथ अपने प्रश्न का उत्तर दिया है।
स्टीववेन्स

1
क्या आपने pgRout मॉड्यूल के साथ अपने PostGIS डेटा को बढ़ाने और इसे अंतर्निहित कार्यों का उपयोग करने पर विचार किया है? जाहिरा तौर पर ए * विधि कुछ इसी तरह का उपयोग करता है
रायनकेडलटन

@ रयानडाल्टन ने मेरा एक और प्रोजेक्ट के लिए pgRout का उपयोग करने पर विचार किया है, लेकिन इस परियोजना के लिए एक सेट करने की परेशानी अधिक सटीक परिणाम या मार्ग की गणना करने में संसाधन लागत के लायक नहीं है।
स्टीववेन्स

जवाबों:


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' के रूप में विख्यात) के बीच Google मैप्स से चलने की दूरी प्राप्त करना। गूगल मैप्स ने 1.1 मील पैदल रास्ता तय किया, जबकि पोस्टग्रेज का परिणाम 5,790 फीट = 1.09 मील था। अंतर मेरे उद्देश्यों के लिए स्वीकार्य है।


1
यह बहुत अच्छा है - आपने एक समस्या को हल कर लिया है जो अन्यथा PGRout 'ड्राइविंग डिस्टेंस' फ़ंक्शन से निपटा जाएगा ... मैं कुछ समस्याओं के लिए इसका परीक्षण करूंगा जो हमारे पास DPS में हैं ...!
DPSSpatial

@mapBaker धन्यवाद! मेरे साधारण गणित की आवश्यकता के लिए pgRout बहुत जटिल है।
स्टीववेन्स

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.