मैटप्लोटलिब के साथ प्लॉट शेपफाइल


15

मैं एक शेपफाइल को पढ़ने की कोशिश कर रहा हूं और इसे matplotlib का उपयोग करके प्लॉट कर रहा हूं। यहाँ कोड है:

import matplotlib.pyplot as plt
import shapefile   

shpFilePath = "D:\test.shp"  
listx=[]
listy=[]
test = shapefile.Reader(shpFilePath)
for sr in test.shapeRecords():
    for xNew,yNew in sr.shape.points:
        listx.append(xNew)
        listy.append(yNew)
plt.plot(listx,listy)
plt.show()

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


शेपफाइल रीडर से परिचित नहीं है, हालांकि मैं बता सकता हूं कि आप प्रत्येक घटक को उसके घटक भागों में अलग किए बिना फ़ाइल के सभी बिंदुओं को एक बड़ी सूची में जोड़ रहे हैं। आपको आकृतियों की एक बड़ी सूची की आवश्यकता है, जिसमें आप प्रत्येक आकार के बिंदुओं को

सही। आकृतियों को अलग करने का एक तरीका खोजना होगा। लेकिन फिलहाल मैं ऐसा नहीं कर पा रहा हूं।
स्टेटबिनर

@DanPatterson क्या आप निर्दिष्ट कर सकते हैं कि आकृति को अलग करने के लिए प्रबंधित करने के बाद एक ही आकृति में कई आकृतियों को कैसे तैयार किया जाए? यदि मैं प्रत्येक आकृति के लिए plt.plot (listx, listy) का उपयोग करता हूं, तो यह एक ही आकृति का उपयोग करने के बजाय, हर बार एक नया आंकड़ा उत्पन्न करता रहता है।
स्टेटबिनर

जवाबों:


10

मैं इसे आपके पास छोड़ दूंगा कि आकृतियों को कैसे इकट्ठा किया जाए लेकिन यह सिद्धांत है

import numpy as np
from matplotlib import pyplot as p  #contains both numpy and pyplot
x1 = [-1,-1,10,10,-1]; y1 = [-1,10,10,-1,-1]
x2 = [21,21,29,29,21]; y2 = [21,29,29,21,21]
shapes = [[x1,y1],[x2,y2]]
for shape in shapes:
  x,y = shape
  p.plot(x,y)
p.show()

ओह .. आश्चर्य है कि मैं कैसे चूक गया। मैं अलग अलग रंग में मुद्रित आकार मिलता है, हालांकि। को ठीक करना होगा :)
स्टेटबिनर

विभिन्न आकारों को कैसे प्राप्त करें या अलग करें?
फ़ॉफ़ी

16

भविष्य के संदर्भों के लिए, नीचे दिए गए सुझावों का पालन करने के बाद मैं यहां आया समाधान हूं।

import shapefile as shp  # Requires the pyshp package
import matplotlib.pyplot as plt

sf = shp.Reader("test.shp")

plt.figure()
for shape in sf.shapeRecords():
    x = [i[0] for i in shape.shape.points[:]]
    y = [i[1] for i in shape.shape.points[:]]
    plt.plot(x,y)
plt.show()

परिणामी आंकड़ा बहुत रंगीन होगा, लेकिन फिर, आपको बस प्लॉट कीवर्ड को समायोजित करने की आवश्यकता है।


6
मुझे पता है कि यह निरर्थक जानकारी हो सकती है, लेकिन इस विषय से अभी तक परिचित नहीं लोगों के लिए यह कहना उपयोगी होगा कि पैकेज import shapefileको संदर्भित करता है pyshp: pypi.python.org/pypi/pyshp
FaCfish

यह ठीक नहीं है जब आपके पास द्वीपों का एक गुच्छा होता है, क्योंकि ये बिंदु मुख्य भूमि के बिंदुओं से लाइनों से जुड़े होंगे, जो कि ओपी द्वारा पोस्ट किए गए समान है।
FaCoffee

1
@ फाफाजी, आप सही कह रहे हैं। मेरा उत्तर gis.stackexchange.com/a/309780/126618 को इस पर ध्यान देना चाहिए।
गस

9

आपको matplotlib रास्तों और पैच का उपयोग करने की आवश्यकता है और इन कार्यों डेसकार्टेस का उपयोग करके शेपफाइल्स से बहुभुज को प्लॉट करने के लिए समर्पित एक पायथन मॉड्यूल है ।

जैसा कि Pyshp (शेपफाइल) में geo_interface ( PyShp के लिए New geo_interface ) सम्मेलन है, आप इसका उपयोग कर सकते हैं।

polys  = shapefile.Reader("polygon")
# first polygon
poly = polys.iterShapes().next().__geo_interface__
print poly
{'type': 'Polygon', 'coordinates': (((151116.87238259654, 135890.8706318218), (153492.19971554304, 134793.3055883224), (153934.50204650551, 133892.31935858406), (152623.97662143156, 131811.86024627919), (150903.91200102202, 130894.49244872745), (149347.66305874675, 132991.33312884573), (149151.08424498566, 134383.76639298678), (151116.87238259654, 135890.8706318218)),)}

परिणाम जियोमेट्री का जियोजन्स प्रतिनिधित्व है और आप मैटप्लोटिब / पायथन का उपयोग करके भू-डेटा को कैसे प्लॉट कर सकते हैं, इसका समाधान कर सकते हैं

import matplotlib.pyplot as plt 
from descartes import PolygonPatch
BLUE = '#6699cc'
fig = plt.figure() 
ax = fig.gca() 
ax.add_patch(PolygonPatch(poly, fc=BLUE, ec=BLUE, alpha=0.5, zorder=2 ))
ax.axis('scaled')
plt.show()

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


यह वास्तव में उपयोगी है, लेकिन क्या आप प्लॉट के लिए कई पॉलीगॉन कर सकते हैं, तो क्या आप इसे लूप के लिए कर सकते हैं?
फ़ॉफ़ी

समस्या के बिना हाँ
जीन

मैंने देखा कि descartesसमाधान काम नहीं करता है यदि आप कोशिश करते हैं और दो अलग-अलग शेपफाइल्स का उपयोग करते हुए दो अलग-अलग आकार के प्लॉट्स का उपयोग करते हैं fig, ax = plt.subplots(1,2,figsize=(15, 8))और फिर ax[0].add_patch(PolygonPatch(poly_geo, fc='#d3d3d3', ec='#000000', alpha=0, zorder=5))और ax[1].add_patch(PolygonPatch(poly_geo, fc='#d3d3d3', ec='#000000', alpha=0, zorder=5))। परिणाम एक खाली छवि है। कोई उपाय?
फाकॉफी

3

Ldocao जवाब के अलावा, और FaCfish सवाल का जवाब। जब आपके पास अलग-थलग द्वीप हैं और वे एक ही विशेषता का हिस्सा हैं, तो आप अगले प्रयास कर सकते हैं:

import shapefile as shp
import matplotlib.pyplot as plt

sf = shp.Reader("test.shp")

plt.figure()
for shape in sf.shapeRecords():
    for i in range(len(shape.shape.parts)):
        i_start = shape.shape.parts[i]
        if i==len(shape.shape.parts)-1:
            i_end = len(shape.shape.points)
        else:
            i_end = shape.shape.parts[i+1]
        x = [i[0] for i in shape.shape.points[i_start:i_end]]
        y = [i[1] for i in shape.shape.points[i_start:i_end]]
        plt.plot(x,y)
plt.show()

यह मेरे लिए काम करता है। किसी आकृति की समरूपता "पुर्जे" एक सुविधा के अंदर विभिन्न ज्यामितीयों के प्रारंभिक अनुक्रमों को लौटाता है।


2

यह जवाब में चर्चा के रूप में या तो जियोपैन्डस या pyshp का उपयोग करके किया जा सकता है । जियोपैन्ड्स प्लॉटिंग के लिए अपने बैकएंड पर matplotlib का उपयोग करते हैं।


0

फिर भी, एक आकृति आकृति में, कई भाग हो सकते हैं। यह प्रत्येक भाग को एक आकार में, अलग-अलग आकार देगा।

import matplotlib.pyplot as plt
import shapefile
import numpy as np

this_shapefile = shapefile.Reader(map_file_base) # whichever file
shape = this_shapefile.shape(i) # whichever shape
points = np.array(shape.points)

intervals = list(shape.parts) + [len(shape.points)]

ax = plt.gca()
ax.set_aspect(1)

for (i, j) in zip(intervals[:-1], intervals[1:]):
    ax.plot(*zip(*points[i:j]))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.