ArcObjects का उपयोग करके Esri ज्यामिति और WKT के बीच रूपांतरण?


17

ऐसा लगता है कि ArcGIS आर्कओबजेक्ट्स एपीआई में एक आर्कोबजेक्ट्स ज्यामिति को वेल-ज्ञात पाठ प्रतिनिधित्व (और इसके विपरीत) में परिवर्तित करने का कोई साधन नहीं है। केवल एक चीज जो मैं खोजने में सक्षम था वह WKB (IWkb इंटरफ़ेस) में रूपांतरण है।

क्या ज्यामिति वस्तुओं और WKT के बीच रूपांतरण करने का कोई तरीका है या क्या मुझे इसे स्वयं लागू करना है? मैं मुख्य रूप से बहुत बाहरी निर्भरता के बिना .NET कार्यान्वयन के लिए लक्ष्य रखता हूं।

जवाबों:


7

अतीत में, मैंने शार्पमैप के कनवर्टर का उपयोग किया है, लेकिन मुझे पहले डब्ल्यूकेबी में जाना था। मुझे नहीं पता कि क्या यह अब सबसे अच्छा विकल्प है।

SharpMap.Geometries.IGeometry sharpGeom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse(geombytes);
wkt = SharpMap.Converters.WellKnownText.GeometryToWKT.Write(sharpGeom);

गितूब पर शार्पपेज

मुझे यह भी पता नहीं है कि वर्तमान शार्पशॉट रिपॉजिटरी कहां है, लेकिन मुझे यहां कक्षा का संदर्भ मिला:

उस समय, मुझे लगता है कि मैं कोडप्लेक्स से SharpMap का उपयोग कर रहा था।

मैं ZigGIS के बारे में भूल गया। आप उस कोड पर निर्माण करने में सक्षम हो सकते हैं - यह लिंक पुरानी ज़िगिस है। यह aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt विधियां हैं, जिनके बारे में मैं सोच रहा हूं कि यह काम करेगा: https://code.google.com/archive/p/ziggis/downloads


AFAIK कोडप्लेक्स में अभी भी सबसे वर्तमान शार्पमैप भंडार है। sharpmap.codeplex.com
Kirk

धन्यवाद। मैं अंत में अपने दम पर रूपांतरण को लागू करने की संभावना समाप्त कर दूंगा, लेकिन मौजूदा OS परियोजनाओं के कोड कुछ मूल्यवान संकेत प्रदान कर सकते हैं।
पेट्र क्रेब्स

@JayCummins ZigGIS लिंक मृत है
Barbarossa

@Barbarossa, मुझे पता है - मैं इसे खोजने की कोशिश कर रहा हूं। हालांकि मुझे संदेह है कि यह सेवानिवृत्त है।
जे कमिंस

12

IWkb इंटरफ़ेस का उपयोग करना एक IGeometry और WKB के बीच कनवर्ट करने पर एक अच्छा काम करता है। WKB से आप Microsoft.SqlServer.Types लाइब्रेरी का उपयोग करके WKB को SqlGeometry में बदल सकते हैं और फिर WKT में वापस ला सकते हैं।

IWkb wkb = geometry as (IWkb); //(Where geometry is an instance of IGeometry)
byte[] wkb_bytes = new byte[wkb.WkbSize];
int byte_count = wkb.WkbSize;
wkb.ExportToWkb(ref byte_count, out wkb_bytes[0]);

इस बिंदु पर आपके पास wkb_bytes में संग्रहीत WKB है। यदि आप SqlGeometry के लिए अगला कदम WKT के लिए जाना चाहते हैं:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();

1
आपका दृष्टिकोण मेरे लिए ठीक काम करता है, लेकिन मैं sridयहाँ अपनी पसंद के बारे में सोच रहा हूँ । मैंने इसका उपयोग किया: int srid = feature.Shape.SpatialReference.FactoryCode;क्या आप उस कार्यान्वयन से सहमत हैं?
एलब्रोबिस

2
जब तक आप Esri के पूर्व-परिभाषित समन्वय प्रणालियों में से एक का उपयोग कर रहे हैं तब तक यह काम करेगा। प्रलेखन निम्नलिखित को नोट करता है "यदि आप एक कस्टम अनुमानित समन्वय प्रणाली बनाते हैं, तो कारखाना कोड शून्य है।"
सेजब्रशगिस

5

आप Microsoft.SqlServer.Types असेंबली को संदर्भित करने का प्रयास कर सकते हैं (जो मुझे लगता है कि नि: शुल्क Sql सर्वर एक्सप्रेस संस्करण के साथ शामिल है), फिर एक Microsoft ज्यामिति बनाने के लिए STGeomFromWKB स्थिर विधि का उपयोग करें , जिसे तब STAsText का उपयोग करके WKT में परिवर्तित किया जा सकता है ।

यह भी ध्यान दें कि जब Microsoft मालिकाना होने के बारे में बहुत कुछ पकड़ता है, तो वे कोडप्लेक्स में अपने SqlServer स्थानिक उपकरण में बहुत सारे उपयोगी कार्यों के लिए स्रोत कोड प्रदान करते हैं । तो अगर SqlServerTypes आपके लिए बहुत अधिक बाहरी निर्भरता है, तो आप ऐसा स्रोत कोड ढूंढने में सक्षम हो सकते हैं जो ऐसा करता है।


धन्यवाद, मैं अपने कार्यान्वयन में किसी भी MsSql बिट्स को नहीं खींचूंगा, लेकिन कुछ स्रोत दिलचस्प हो सकते हैं।
पेट्र क्रेब्स

3

एनटीएस डब्ल्यूकेटी को "बोल" सकते हैं, और डब्ल्यूकेबी और डब्ल्यूकेटी दोनों के लिए पाठक और लेखक हैं। इसलिए यदि आपके पास WKB है, तो NTS उसे पढ़ सकता है और WKT को लिख सकता है।

हालाँकि, आप एक आर्कऑब्जेक्ट्स ज्यामिति और फिर डब्ल्यूकेटी के रूप में आउटपुट की विशेषताओं का उपयोग करके एनटीएस ऑब्जेक्ट भी बना सकते हैं।

हमारे आर्कबोज प्रोजेक्ट्स में से एक के लिए हमने एनटीएस के लिए ज्यामिति को स्थानांतरित करने के लिए उपयोगिता के तरीकों का निर्माण किया (ज्यादातर वैकल्पिक प्रक्षेपण विधियों एनटीएस ऑफ़र का लाभ उठाने के लिए)।


धन्यवाद, NTS और GeoTools अच्छा लग रहा है, मैं अपने कार्यान्वयन में कुछ बिट्स का पुन: उपयोग कर सकता हूं।
पेट्र क्रेब्स

3

DNRGPS ओपन सोर्स प्रोजेक्ट (लाइसेंस यहाँ ) के बीच परिवर्तित करने के लिए विस्तार के तरीकों है IGeometryवाली WKT- और, यद्यपि आप अनुकूल करने के लिए उनका उपयोग नहीं कर करना होगा IObjectFactoryकि आप उन्हें एक ArcGIS आवेदन के बाहर उपयोग करना चाहते हैं।

लाइसेंस बहुत अनुज्ञेय लगता है इसलिए मैंने अपना स्टैंडअलोन संस्करण (इसका उपयोग नहीं करता है IObjectFactory) को GitHub पर रखा है यदि वह पूर्ण नहीं था:

अपडेट: मैंने आउटपुट ज्योमेट्री ऑब्जेक्ट्स के लिए स्थानिक संदर्भों को लागू करने और पूर्णांक समन्वित अनुकूल डिफ़ॉल्ट स्थानिक संदर्भ (प्लेट कैरी) का उपयोग करने के लिए अपने संस्करण में कुछ सुधार किए हैं यदि कोई भी निर्दिष्ट नहीं है।


धन्यवाद, उपयोगी देखो। मैंने वास्तव में अपना खुद का डब्ल्यूकेटी पार्सर लिखना समाप्त कर दिया। यद्यपि यह खुला स्रोत नहीं कर सकता।
पेट्र क्रेब्स

-2

ज्योमेट्रीब्रिज देखें, यह आपकी मदद करने में सक्षम हो सकता है। http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000


यह किसी भी WKT- संबंधित तरीके प्रदान नहीं करता है ... आप इसे WKS के साथ भ्रमित कर सकते हैं, जो कि एक ज्यामिति (थ्रेड सुरक्षा और इस तरह के लिए उपयोगी) का एक सुरक्षित प्रतिनिधित्व है।
पेट्र क्रेब्स


@ मैपरेज़: वहाँ भी देखा, लेकिन समन्वय प्रणालियों और इकाइयों के केवल डब्ल्यूकेटी अभ्यावेदन के लिए काम करता है, ज्यामितीय नहीं
पेट्र क्रेब्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.