2012-08-27 11 views
29

मेरे पास एक तालिका geofences है जो पॉलीगॉन के geometry स्टोर करती है।पोस्टगिस ज्यामिति की सीमा पर दो निकटतम अंक

मेरे पास एक बिंदु A भी है जो ज्यामिति के अंदर है। मुझे क्या करना है पॉलीगॉन ज्यामिति की सतह पर स्थित बिंदु A से दो निकटतम बिंदु खोजें।

PostGIS में

फंक्शन:

CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry 
             ,decimal lat 
             ,decimal lon) 
    RETURNS VARCHAR AS 
$BODY$ 

DECLARE height DECIMAL; 
DECLARE accuracy VARCHAR(250); 

BEGIN 

CREATE TEMPORARY TABLE closePointStorage AS 
SELECT ST_AsText(ST_ClosestPoint(geometry 
           ,ST_GeomFromText('POINT(lat lon)',0) 
           ) 
       ) AS closestPoint 
FROM (
    SELECT ST_GeomFromText(geometry) as geometry 
    FROM gfe_geofences 
    WHERE is_active=true 
    ) As tempName; 

CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS 
SELECT ST_Area(ST_GeomFromText('Polygon((23.0808622876029 96.1304006624291 
             ,28.0808622876029 99.1304006624291 
             ,100    200 
             ,23.0808622876029 96.1304006624291 
             ))' 
           ,0) 
      ) AS area; 

CREATE TEMPORARY TABLE distanceStorage ON COMMIT DROP AS 
SELECT ST_Distance(
      ST_GeomFromText('POINT(23.0808622876029 96.1304006624291)',-1) 
     ,ST_GeomFromText('POINT(28.0808622876029 99.1304006624291)',-1) 
     ) AS distance; 

height = (SELECT area FROM areaStorage) 
     /(0.5*(SELECT distance FROM distanceStorage)); 

IF height < (SELECT radius_meters 
      FROM gfe_geofences Where is_active=true) THEN 
    accuracy = "FullConfirm"; 
    RETURN accuracy; 
ELSE 
    accuracy = "PartiallyConfirm"; 
    RETURN accuracy; 
END IF; 

END; 
$BODY$ LANGUAGE plpgsql; 

मैं सिर्फ बहुभुज ज्यामिति की सीमा पर दो अंक लगाना चाहते हैं। वैसे ही जैसे मैं क्वेरी से एक मिल गया है:

CREATE TEMPORARY TABLE closePointStorage AS 
SELECT ST_AsText(ST_ClosestPoint(geometry 
           ,ST_GeomFromText('POINT(lat lon)',0) 
           ) 
       ) AS closestPoint 
FROM (
    SELECT ST_GeomFromText(geometry) as geometry 
    FROM gfe_geofences 
    WHERE is_active=true 
    ) 
AS tempName; 

अन्य तो इस बिंदु मैं अधिक से अधिक तो बिंदु से ऊपर लगता है लेकिन छोटे अंक के बाकी तो दूरी के साथ एक और खोजने के लिए।

+0

डबल lat1 = Math.toRadians (26.5534d); \t \t डबल लॉन 1 = Math.toRadians (75.4925 डी); \t \t डबल lat2 = Math.toRadians (28.3650d); \t \t डबल lon2 = Math.toRadians (77.1232d); \t \t डबल डेलैट = (lat2 - lat1); \t \t डबल डेलन = (लॉन 2 - लॉन 1); \t \t डबल आर = 6371; \t \t डबल एक = गणित.पाप ((dellat)/2) * गणित.पाप ((dellat)/2) \t \t \t \t + गणित.क्योंकि (lat1) * गणित.क्योंकि (lat2) * गणित.पाप ((डेलन)/2) \t \t \t \t * Math.sin ((डेलन)/2); \t \t डबल सी = 2 * (Math.atan2 (Math.sqrt (ए), Math.sqrt (1 - ए))); \t \t डबल डी = आर * सी; \t \t System.out.println ("किमी में दूरी का मूल्य =" + डी); –

+0

ने बिंदु ए के साथ ज्यामिति से प्रत्येक बिंदु के लिए लूप में दूरी की गणना की और उन सभी से कम से कम या न्यूनतम दूरी खोजें। –

+0

यदि आप केवल ज्यामिति में बिंदुओं की परवाह करते हैं, न कि बिंदुओं के बीच रेखा खंड, तो आप बहुभुज की सीमा को मल्टीपॉइंट में परिवर्तित कर सकते हैं, निकटतम बिंदु ढूंढ सकते हैं, इसे हटा सकते हैं और फिर दूसरा निकटतम बिंदु ढूंढ सकते हैं। –

उत्तर

0

बहुभुज के बिंदुओं को डंप करने के लिए ST_DumpPoints() का उपयोग करें, फिर उस क्रम से ST_Distance द्वारा एक सीमा 2 में चुनें।

तो यह

SELECT * from ST_DumpPoints(poly) order by ST_Distance(A,geom) asc limit 2; 

(जैसे कुछ मानता है कि यह एक आंतरिक का चयन जहां पाली बहुभुज है, एक करने के लिए तुलना करने के लिए बिंदु है और geom में बिंदुओं में से एक की geom स्तंभ है पॉली की तुलना की जा रही है)

+0

यह स्वाभाविक रूप से पॉलीगॉन परिभाषा में केवल एक बिंदु पर अंक नहीं उठाएगा। अगर आप दूरी के वर्ग से बस उन्हें आदेश दे सकते हैं तो यह तेज़ होगा। –

0

यदि आप लाइनों को शामिल करते हैं तो आमतौर पर सीमा बहुभुज पर कोई दूसरा निकटतम बिंदु नहीं है। जैसे शून्य के निकट दूसरा वास्तविक नंबर नहीं है। या तो आप केवल कोनों पर बिंदुओं पर विचार करना चाहते हैं, जैसे मार्कस सुझाव देता है। या आपके पास केवल एक निकटतम बिंदु है।

0

1) बाएं क्षेत्र के विचार की तरह, लेकिन दूसरा - अपने गंतव्य के लिए सबसे नज़दीकी बिंदु खोजने के लिए, आपको पहले से मिले बिंदु के निकटतम बिंदु क्यों नहीं मिलते?

2) या, अपने विशिष्ट प्रश्न के लिए और अधिक जर्मेन,

  • बिंदु के कुछ उचित सीमा के भीतर अंक के सेट मिल जाए,
  • पर झूठ बोल अंक के सेट के साथ है कि सेट के चौराहे लगता है बहुभुज सीमा (जो मैं एक PostGIS समारोह हो सकता है अनुमान लगा रहा हूँ; थोड़ी देर में postG इस्तेमाल नहीं किया है तो मैं यकीन नहीं है)

3) छोड़ दिया क्षेत्र में आगे, मोंगो में आपके डेटासेट के कुछ डंप और $ निकटतम फ़ंक्शन का उपयोग करें ... http://docs.mongodb.org/manual/reference/operator/near/

1

मैं तुम्हें बहुभुज उस सवाल

distance from line problem

दूरी लाइन से बिंदु C का 'प' प्राप्त करने के लिए [एक में बिंदु के सबसे करीब से गुजरता के किनारे लगाना चाहते हैं यह सोचते हैं हूँ , बी] पहले सभी बिंदुओं का अनुवाद तो एक 0,0

B -= A //vector subtraction 
C -= A 

पर है तो बी को सामान्य तो यह लंबाई 1 का है।एक से 0

len = sqrt(B . B) //dotproduct of two vectors is the length squared 
B /= len //scalar divide by length 

ढूँढें लंबाई सी

dotp = B . C //dot product again 
closestPointOnLine = B * dotp //scalar multiply 

से समकोण पर है कि अब दूरी

diff = (C - ClosestPointOnLine) 
d = sqrt(diff . diff) 

कि कैसे करना है एसक्यूएल में सुनिश्चित नहीं हैं मिलता है। आप अपने बहुभुज पर प्रत्येक बढ़त के लिए ऊपर करने की आवश्यकता होगी, और उसके बाद सबसे छोटा मान 'प'

बी के पार उत्पाद का संकेत लगता है वैसे और क्या बिंदु पर है सी अब आपको बता देंगे बहुभुज के अंदर या

+0

आपका अलगो अच्छा और समझदार है, आपके द्वारा अच्छे प्रयास, मैं एसक्यूएल में इसका उपयोग करने की कोशिश करता हूं क्योंकि मेरी निर्भरता इस तरह के एल्गोरिदम को केवल एसक्यूएल में लागू करने के लिए है। –

संबंधित मुद्दे