एक बाउंडिंग बॉक्स के भीतर सभी बिंदुओं का चयन करें


11

मैंने इस प्रश्न को पहले देखा है, लेकिन मैं जो उत्तर दे रहा हूं वह काम नहीं कर रहा है।

मैं सभी OSM तरीके क्वेरी करना चाह रहा हूं जो एक बाउंडिंग बॉक्स के भीतर हैं। OSM डेटा डिफ़ॉल्ट गोलाकार व्यापारी के साथ आयात किया गया था। मैं इसलिए बदलाव के लिए LAT / LON का उपयोग कर क्वेरी कर रहा हूं

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

जब मैं इसे चलाता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

त्रुटि: तर्क का प्रकार बूलियन होना चाहिए, न कि ज्यामिति लाइन 3 टाइप करें: जहां ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12) ...


1
पुराने प्रश्नों के लिए एक लिंक दें जिसे आप पढ़ रहे हैं और अपनी क्वेरी बनाने के लिए उपयोग किया जाता है।
user30184

ST_MakeEnvelope () में आपका समन्वय क्रम ऐसा नहीं दिखता है जैसे वे इस प्रारूप में हैं, xmin, ymin, xmax, ymax
कलाकृति 21

@ कलाकृति 21 मैं ST_MakeEnvelope में एक lat / long का उपयोग कर रहा हूं। क्या वह गलत है? क्या मुझे इसे एक अलग प्रारूप में बदलने की आवश्यकता है? मुझे लगा कि ST_Transform क्या कर रहा है
theartofbeing

1
क्षमा करें, मुझे स्कीमा दस्तावेज़ सहित wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways फिर से ठीक मैनुअल को पढ़ना था । Planet_osm_ways में जियोमेट्रीज़ नहीं हैं और यह एंड-यूज़र के लिए बेकार है। यह सिस्टम के लिए है। उस तालिका से बाउंडिंग बॉक्स प्रश्न बनाने का कोई मौका नहीं। Planet_osm_roads जैसी तालिकाओं के साथ यह संभव है। अभी भी planet_osm_roads.geom मौजूद नहीं है, क्योंकि जैसा कि आप स्कीमा से देखते हैं, इसे planet_osm_roads.way नाम दिया गया है।
user30184

1
नहीं। मैंने कहा कि आप planet_osm_ways से बॉक्स क्वेरी को बाउंड नहीं कर सकते, क्योंकि उस तालिका में कोई ज्यामिति नहीं है। देखें: आईडी, नोड्स, टैग, लंबित - उनमें से कोई भी ज्यामितीय नहीं है। टेबल्स _line, _point, _polygon, और _roads ठीक हैं। और मैंने इस बात पर जोर देने की कोशिश की कि सभी ज्यामिति तालिकाओं में ज्यामिति स्तंभ का नाम "रास्ता" है, न कि "जियोम" या कुछ और।
user30184

जवाबों:


14

आपके कथन के साथ आपको तीन समस्याएं हैं, हालांकि त्रुटि संदेश केवल उसी के हिस्से में संकेत कर रहा है ... "WHERE टाइप बूलियन होना चाहिए" इसका मतलब है कि आपने WHERE को जो जानकारी दी है वह बूलियन परिणाम का मूल्यांकन नहीं कर रही है।

  1. ST_MakeEnvelope इस क्रम में अपने मापदंडों के लिए पूछता है xmin, ymin, xmax, ymax, srid:।

    आप गलत तरीके से पास हुए ymax, ymin, xmax, xmin, srid

  2. बूलियन का मूल्यांकन कहां करना चाहिए:

    यह निर्धारित करने के लिए कि क्या ज्यामिति और लिफाफे में कोई तत्व समान है , जहां इसका निर्माण किया जाना चाहिए: WHERE geom && envelope_geomअन्यथा आप ST_CRtains का उपयोग कर सकते हैं

    यह निर्धारित करने के लिए कि क्या ज्यामिति लिफाफे के भीतर है: `जहां ST_Contains (लिफाफे_जोम, जियोम)

    आपने तुलना के किसी भी तरीके की आपूर्ति नहीं की WHERE

  3. तालिका 'planet_osm_ways' में कोई ज्यामिति स्तंभ नहीं है, हालांकि 'planet_osm_roads' में 'ज्यामिति' नाम का एक ज्यामिति स्तंभ शामिल है।

    आप संबंधित planet_osm_nodes.lat और planet_osm_nodes.lon से तालिका 'planet_osm_ways' में एक ज्यामिति स्तंभ बना सकते हैं।

'Planet_osm_roads' का उपयोग करना, यह दिखाता है कि एक ज्यामिति स्तंभ के साथ एक टेबल के खिलाफ एक बाउंडिंग बॉक्स का उपयोग कैसे करें:

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

या इसे इसमें बदलें:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.