समस्या MySQL के माध्यम से त्रिज्या में ज़िप हो रही है


9

मेरे पास ज़िप कोड की एक तालिका है, जिसमें प्रत्येक अक्षांश कोड के लिए केंद्र lat, lng शामिल है। मैं किसी भी मनमाने बिंदु से दिए गए मील के दायरे में ज़िप कोड की सूची प्राप्त करने के लिए इसका उपयोग करता हूं।

यह सिर्फ मेरे लिए हुआ है, सिर्फ इसलिए कि एक ज़िप का केंद्र बिंदु किसी दिए गए दायरे के भीतर नहीं है, इसका मतलब यह नहीं है कि ज़िप खुद त्रिज्या के भीतर नहीं है।

मैंने अपने सुपर एडवांस्ड आर्ट स्किल्स का इस्तेमाल यहां की बात को समझने के लिए किया है:

यहां छवि विवरण दर्ज करें

  • हरी धारीदार बूँदें ज़िप कोड A, B और C का प्रतिनिधित्व करती हैं।

  • लाल धब्बा प्रत्येक ज़िप कोड के लिए भौगोलिक केंद्र होते हैं

  • फुकिया डॉट टारगेट लोकेशन है, और ।।

  • लम्बी नीला वृत्त लक्ष्य स्थान से 1 मील की दूरी पर है

यदि मैं गुलाबी स्मूदी से 1 मील के दायरे में सभी ज़िप कोड के लिए एक क्वेरी चलाता हूं, तो केवल ज़िप कोड B और C को वापस भेजा जाएगा क्योंकि ज़िप A के लिए केंद्र बिंदु एक मील के दायरे में नहीं है, भले ही गुलाबी smudge हो ज़िप कोड A में स्पष्ट रूप से है।

SELECT *,
        p.distance_unit
                 * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                 * COS(RADIANS(z.y))
                 * COS(RADIANS(p.longpoint) - RADIANS(z.x))
                 + SIN(RADIANS(p.latpoint))
                 * SIN(RADIANS(z.y)))) AS dist
  FROM standard_zip AS z
  JOIN (   /* these are the query parameters */
        SELECT  $lat  AS latpoint,  $lng AS longpoint,
                $miles AS radius,      69 AS distance_unit
    ) AS p ON 1=1
  WHERE z.y
     BETWEEN p.latpoint  - (p.radius / p.distance_unit)
         AND p.latpoint  + (p.radius / p.distance_unit)
    AND z.x
     BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
         AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
  ORDER BY dist

कैसे हो सकता है कि मैं एक प्रश्न लिखूं जिसमें परिणामों में ज़िप ए शामिल होगा?

मेरे पास प्रत्येक ज़िप कोड के लिए स्थानिक / ज्यामिति तक पहुंच है जिसे मैं ज़रूरत पड़ने पर तालिका में जोड़ सकता हूं, लेकिन मुझे नहीं पता कि मैं MySQL में इस उद्देश्य के लिए इसका उपयोग कैसे करूंगा।


संपादित करें : मैंने स्थानिक डेटा के लिए ओरेकल और MySQL डॉक्स को पढ़ने में एक दिन बिताया और सफलतापूर्वक अपने स्थानिक डेटा को MySQL में बदलने में कामयाब रहा । मैं एक समान क्वेरी लिखने के बारे में कैसे जाऊं जो अक्षांश और लंबे के बजाय ज्यामिति कॉलम का उपयोग करता है? मैं 2D डेटा का उपयोग कर रहा हूँ .. ज्यामिति बहुभुज हैं और केवल बहुभुज हैं ..

मुझे लगता है कि मैं इसे सुलझा लिया ..

select
  *
from
  (
    select
      MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
      zip
    from
      zip_spatial
    group by
      zip
    order by
      miles asc
  ) d
where
  d.miles < 5

अगर किसी के पास एक बेहतर, अधिक कुशल समाधान है, तो मैं अब के लिए इनाम को खुला छोड़ दूंगा।

जवाबों:


7

से अनुक्रमण और Oracle में क्वैरी स्थानिक डाटा Oracle® स्थानिक डेवलपर की मार्गदर्शिका 11g रिलीज़ 2 (11.2) में:

स्थानिक डेटा को छोड़ना

स्थानिक प्रश्नों और स्थानिक जुड़ावों को हल करने के लिए प्राथमिक और द्वितीयक फ़िल्टर संचालन के साथ स्थानिक द्वि-स्तरीय क्वेरी मॉडल का उपयोग करता है। दो-स्तरीय शब्द इंगित करता है कि प्रश्नों को हल करने के लिए दो अलग-अलग ऑपरेशन किए जाते हैं। यदि दोनों ऑपरेशन किए जाते हैं, तो सटीक परिणाम सेट वापस आ जाता है।

यदि आप किसी तालिका में स्थानिक तालिका के नाम से डेटाबेस लिंक (डब्लिंक) का नाम नहीं जोड़ सकते हैं यदि उस तालिका पर स्थानिक सूचकांक परिभाषित किया गया है।

स्थानिक प्रश्न

एक स्थानिक आर-ट्री इंडेक्स में, प्रत्येक ज्यामिति को इसकी न्यूनतम बाउंडिंग आयत (एमबीआर) द्वारा दर्शाया जाता है। चित्रा 1 में कई वस्तुओं वाली निम्न परत पर विचार करें। प्रत्येक ऑब्जेक्ट को उसके ज्यामिति नाम (लाइन स्ट्रिंग के लिए geom_1, चार-पक्षीय बहुभुज के लिए geom_2, त्रिकोणीय बहुभुज के लिए geom_3, और दीर्घवृत्त के लिए geom_4) के साथ लेबल किया गया है, और प्रत्येक ऑब्जेक्ट के चारों ओर MBR एक धराशायी रेखा द्वारा दर्शाया गया है।

चित्रा 1 एमबीआर के साथ ज्यामिति

"एमबीआर के साथ चित्रा 1 ज्यामितीय" का विवरण

एक विशिष्ट स्थानिक क्वेरी उन सभी वस्तुओं का अनुरोध करने के लिए है जो एक क्वेरी विंडो, यानी एक परिभाषित बाड़ या खिड़की के भीतर स्थित हैं। एक गतिशील क्वेरी विंडो एक आयताकार क्षेत्र को संदर्भित करता है जो डेटाबेस में परिभाषित नहीं है, लेकिन इसका उपयोग करने से पहले इसे परिभाषित किया जाना चाहिए। चित्रा 2 चित्र 1 के समान ही ज्यामितीय दिखाता है, लेकिन भारी बिंदीदार रेखा बॉक्स द्वारा दर्शाई गई एक क्वेरी विंडो जोड़ता है।

चित्र 2 एक क्वेरी विंडो के साथ परत

"चित्रा 2 परत एक क्वेरी विंडो के साथ" का विवरण

चित्र 2 में, क्वेरी विंडो में geometries geom_1 और geom_2 के भाग शामिल हैं, साथ ही geom_3 के लिए MBR का भी हिस्सा है, लेकिन वास्तविक geom_3 ज्यामिति में से कोई भी नहीं है। क्वेरी विंडो geom_4 ज्यामिति या उसके MBR के किसी भी भाग को कवर नहीं करती है।

प्राथमिक फ़िल्टर ऑपरेटर

SDO_FILTER ऑपरेटर, ओरेकल स्पेसियल क्वेरी प्रोसेसिंग मॉडल में शामिल दो-चरण प्रक्रिया के प्राथमिक फ़िल्टर भाग को लागू करता है। प्राथमिक फ़िल्टर इंडेक्स डेटा का उपयोग केवल यह निर्धारित करने के लिए करता है कि उम्मीदवार ऑब्जेक्ट जोड़े का एक सेट बातचीत कर सकता है या नहीं। विशेष रूप से, प्राथमिक फ़िल्टर यह देखने के लिए जांचता है कि क्या उम्मीदवार वस्तुओं के एमबीआर बातचीत करते हैं, न कि यह कि ऑब्जेक्ट स्वयं इंटरैक्ट करते हैं। SDO_FILTER ऑपरेटर सिंटैक्स निम्नानुसार है:

SDO_FILTER(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2)

पूर्ववर्ती सिंटैक्स में:

  • geometry1 एक तालिका में SDO_GEOMETRY प्रकार का एक स्तंभ है। इस कॉलम को स्थानिक रूप से अनुक्रमित किया जाना चाहिए।

  • geometry2 SDO_GEOMETRY प्रकार की एक वस्तु है। यह ऑब्जेक्ट किसी तालिका से आ सकता है या नहीं। यदि यह किसी तालिका से आता है, तो इसे स्थानिक रूप से अनुक्रमित नहीं किया जा सकता है या नहीं।

  • परम प्रकार VARCHAR2 का एक वैकल्पिक स्ट्रिंग है। यह या तो min_resolution और max_resolution कीवर्ड दोनों को निर्दिष्ट कर सकता है।

निम्न उदाहरण केवल एक प्राथमिक फ़िल्टर ऑपरेशन करते हैं (कोई द्वितीयक फ़िल्टर ऑपरेशन के साथ)। वे चित्रा 2 में दिखाए गए सभी ज्यामितीयों को वापस करेंगे जिसमें एक एमबीआर है जो क्वेरी विंडो के साथ इंटरैक्ट करता है। निम्नलिखित उदाहरणों का परिणाम ज्यामितीय geom_1, geom_2 और geom_3 हैं।

उदाहरण 1 क्वेरी विंडो को एक तालिका में सम्मिलित किए बिना एक प्राथमिक फ़िल्टर ऑपरेशन करता है। खिड़की को मेमोरी में अनुक्रमित किया जाएगा और प्रदर्शन बहुत अच्छा होगा।

उदाहरण 1 एक अस्थायी क्वेरी विंडो के साथ प्राथमिक फ़िल्टर

SELECT A.Feature_ID FROM TARGET A  WHERE sdo_filter(A.shape, SDO_geometry(2003,NULL,NULL,
                                       SDO_elem_info_array(1,1003,3),
                                       SDO_ordinate_array(x1,y1, x2,y2))
                           ) = 'TRUE';   

उदाहरण 1 में, (X1, y1) और (x2, y2) क्वेरी विंडो के निचले-बाएँ और ऊपरी-दाएँ कोने हैं।


1
कूल .. तो मुझे त्रिज्या का प्रतिनिधित्व करने के लिए सर्कल ज्यामिति का निर्माण करना चाहिए और फिर बस यह देखना चाहिए कि कौन से बहुभुज प्रतिच्छेद करते हैं .. दिलचस्प .. जानकारी के लिए thx
मैंने एक बार एक भालू को कुश्ती दी।

हाँ .. पर ... आशा है कि यह आपके लिए ठीक काम करता है।
l.lijith

5

ए को शामिल करने के किसी भी प्रयास में संभवतः डी, ई, एफ, जी शामिल होंगे। प्रत्येक ज़िप कोड क्षेत्र को परिभाषित करने वाले सटीक मार्ग के बिना समस्या को हल नहीं किया जा सकता है।

इस तरह के एक डेटाबेस का पता लगाएं, फिर SPATIALइस तरह के मनमाने बहुभुज का उपयोग करके एक सूचकांक बनाएं।


मुझे पता है कि मुझे स्थानिक डेटा की आवश्यकता है (और मेरे पास यह है, लेकिन यह एक ओरेकल तालिका में है और मुझे इसे कैसे बदलना है, इसके बारे में अधिक जानकारी नहीं मिल रही है) .. समस्या यह पता लगा रही है कि डेटा को कैसे क्वेरी करें।
मैंने एक बार एक भालू को कुश्ती दी।

यदि आप नए कोड के प्रदर्शन से खुश हैं, तो शायद यह सबसे अच्छा है। नोट: क्वेरी हर ज़िप के लिए दूरी को सूचीबद्ध करती है, इसलिए संभवतः कोई अनुकूलन क्षमता नहीं है। (बेहतर कोड मिलने पर मुझे सुखद आश्चर्य होगा।)
रिक जेम्स

मैं भी यही सोच रहा हूँ। मैं आपको यह समय देने से पहले इनाम दूंगा और आप इसे वैसे भी आधा प्राप्त कर सकते हैं .. बस यह देखना चाहते हैं कि मुझे और क्या प्रतिक्रियाएं मिल सकती हैं।
मैंने एक बार एक भालू को कुश्ती दी।

3

आप यह गलत कर रहे है। सबसे पहले, यदि संभव हो, तो PostGIS का उपयोग करें - जो स्थानिक समाधान के साथ अग्रणी RDMBS है।

फिर आप इन चरणों का पालन करना चाहते हैं।

  1. जनगणना के बाघ डेटासेट से ZCTA (ज़िप कोड टैबूलेशन एरिया) को नीचे खींचें । ज़िप कोड वास्तव में कुछ के लिए नहीं जानते हैं। आधिकारिक तौर पर, ज़िप कोड केवल यूएसपीएस द्वारा आंतरिक उपयोग के लिए हैं। क्योंकि हर कोई उनका उपयोग करता है, जिसमें सरकार भी शामिल है, दूसरा सबसे आधिकारिक स्रोत ZCTA शेपफाइल्स बन गया है।
  2. अपने डेटाबेस में इन शेपफाइल्स को आयात करें, PostgreSQL के साथ आप आसानी से उपयोग कर सकते हैं shp2pgsql
  3. आपके द्वारा आयात की गई ज्यामिति को अनुक्रमित करें।

    CREATE INDEX ON census_zcta USING gist (geog);
    ANALYZE census_zcta;
  4. शेपफाइल्स के खिलाफ पॉइंट-ऑफ-इंटरेस्ट (POI) क्वेरी चलाएँ। आपके मामले में रुचि बिंदु इनपुट कॉर्ड है, यह इस तरह दिखेगा,

    SELECT *
    FROM census_zcta AS zcta
      WHERE ST_Intersects( zcta, ST_MakePoint(long,lat)::geog );

। 1609.344 मीटर = 1 मील

माई एसक्यूएल

MySQL के साथ आपके पास होगा

  1. जनगणना आकार के लिए MySQL डालने बयान उत्पादन करने के लिए ogr2ogr का उपयोग करें।
  2. MBRIntersectsस्थानिक सूचकांक का उपयोग करने के लिए उपयोग करें । अंतिम क्वेरी कुछ इस तरह दिखनी चाहिए

    SELECT *
    FROM zcta
    WHERE MBRIntersects( geom, Point(long,lat) )
      AND ST_Intersects ( geom, Point(long,lat) );

3
1) मुझे पता है कि मैं यह गलत कर रहा था। यही कारण है कि मैंने पूछा 2) जिस कंपनी के लिए मैं काम करता हूं उसने आंतरिक ज़िप कोड सीमाओं तक पहुंच का भुगतान किया है। हमने इस परियोजना के लिए सीधे usps के साथ काम किया, और 3) आम तौर पर, यह सुझाव देते हुए कि ओपी एक पूरी तरह से अलग टूलसेट का उपयोग करता है एक उचित उत्तर नहीं है।
मैंने एक बार एक भालू को कुश्ती दी।

1
@iwrestledabearonce आप यह सब कुछ MySQL 8 के साथ भी कर सकते हैं, बस इसके ST_DWithinसाथ स्थानापन्न करेंMBRIntersects
इवान कैरोल

1
"आंतरिक ज़िप कोड सीमाओं का उपयोग करने के लिए भुगतान किया" क्या आप उस उत्पाद का नाम जानते हैं? AFAIK ऐसी कोई चीज नहीं है। (हालांकि USPS 2 डेटा उत्पादों और डिकोडिंग एड्रेस के लिए कुछ एपीआई की पेशकश करता है)
इवान कैरोल

1
mysql के बारे में जानकारी जोड़ने के लिए धन्यवाद। +1। एपीआई सार्वजनिक नहीं है और यह किसी भी सूची में सूचीबद्ध नहीं है, वास्तव में एंडपॉइंट यूआरएल का डोमेन नाम भी नहीं है, हम इसे सीधे आईपी पते से अनुरोध करते हैं। हालाँकि, सिर्फ़ यह साबित करने के लिए कि यह दस्तावेज़ में सूचीबद्ध है (3 जो EDDM को संदर्भित करते हैं, वे हैं जिनका मैं उल्लेख कर
रहा

1
अगर आप EDDM / SelectZIP एंडपॉइंट को बंद कर रहे हैं तो यह वास्तव में वैध प्रतीत होता है। यह उस उद्देश्य के लिए विज्ञापित नहीं है, लेकिन उस अंतिम बिंदु को खोजने के लिए यश है।
इवान कैरोल

1

GreatData.com से सेट किए गए इस डेटा को देखें (ध्यान दें कि यह ओपन सोर्स नहीं है बल्कि एक पेड सर्विस है)।

वे ज़िप के केंद्र के बजाय जनसंख्या घनत्व का उपयोग करते हैं।

और तेजी से सही परिणाम प्राप्त करने के लिए एसक्यूएल सर्वर स्थानिक डेटा प्रकार का उपयोग कैसे करें।

उम्मीद है की यह मदद करेगा।


क्या यह डेटा MySQL के लिए उपलब्ध है या यह SQL सर्वर के लिए ही उपलब्ध है?
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.