ম্যাটপ্ল্লোলিবের সাথে প্লট শেফফাইল


15

আমি একটি শেফফিল পড়ার চেষ্টা করছি এবং ম্যাটপ্ল্লিটিব ব্যবহার করে এটি প্লট করব। কোডটি এখানে:

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()

যাইহোক, আমি আমার বহুভুজগুলি সংযুক্ত করার জন্য লাইন পাই। আমি বহুভুজগুলি কীভাবে এমনভাবে আঁকতে পারি যে সেগুলি শেফফাইলের পথে। আরকিজিআইএস দিয়ে এটি খোলার সময় এখানে প্লটটির স্ক্রিনশট এবং শেফফিল রয়েছে।কোড দ্বারা উত্পাদিত আসল ফাইল


শেফফাইল পাঠকের সাথে পরিচিত নয়, তবে আমি বলতে পারি যে আপনি প্রতিটি আকৃতিকে তার উপাদানগুলির অংশগুলিতে আলাদা না করে কেবলমাত্র ফাইলের সমস্ত পয়েন্টকে একটি বড় তালিকায় যুক্ত করছেন। আপনার আকারের একটি

ঠিক। আকারগুলি পৃথক করার জন্য কোনও উপায় খুঁজতে হবে। তবে আমি এই মুহূর্তে করতে অক্ষম।
#Beginner

@ ড্যানপ্যাটারসন আমি আকারগুলি পৃথক করে পরিচালনা করার পরে কীভাবে একই চিত্রে একাধিক আকারের প্লট করবেন তা আপনি নির্দিষ্ট করতে পারেন? যদি আমি প্রতিটি আকারের জন্য plt.plot (listx, listy) ব্যবহার করি তবে এটি একই চিত্র ব্যবহার না করে প্রতিবারই নতুন চিত্র তৈরি করে keeps
স্টেটবিগনার

উত্তর:


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()

ওহ .. আশ্চর্য আমি কীভাবে এটি মিস করেছি। আমি আকারে বিভিন্ন রঙে মুদ্রিত পেতে পারি। এটি ঠিক করতে হবে :)
স্ট্যাটবিগনার

কিভাবে পেতে বা বিভিন্ন আকৃতি বিচ্ছিন্ন?
ফ্যাকফি

15

ভবিষ্যতের রেফারেন্সগুলির জন্য, উপরের পরামর্শগুলি অনুসরণ করার পরে আমি এখানে এসেছি এমন সমাধান।

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
ফ্যাকফি

আপনার কাছে দ্বীপগুলির একগুচ্ছ থাকাকালীন এটি ঠিক নয়, কারণ এই পয়েন্টগুলি লাইন দিয়ে মূল ভূখণ্ডের পয়েন্টগুলিতে সংযুক্ত হবে এবং ওপি পোস্টের মতো কিছু তৈরি করবে।
ফ্যাকফি 11

1
@ ফ্যাকফি, আপনি ঠিক বলেছেন। আমার উত্তর gis.stackexchange.com/a/309780/126618 এ এটিকে সম্বোধন করা উচিত।
গুস

9

আপনাকে ম্যাটপ্ল্লোলিব পাথ এবং প্যাচগুলি ব্যবহার করতে হবে এবং ডেসকার্টস এই ফাংশনগুলি ব্যবহার করে শেফফিলগুলি থেকে বহুভুজগুলি প্লট করতে উত্সর্গীকৃত একটি পাইথন মডিউল রয়েছে ।

যেহেতু পাইশপ (শেফফিল) এর জিও_ইন্টারফেস ( পিআইএসপিএর জন্য নতুন জিও_ইন্টারফেস ) কনভেনশন রয়েছে, আপনি এটি ব্যবহার করতে পারেন।

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))। ফলাফলটি একটি খালি চিত্র। কোন ধারণা?
ফ্যাকফি 18

3

Ldocao জবাব ছাড়াও, এবং ফ্যাকফি প্রশ্নের উত্তর দেওয়া। আপনি যখন বিচ্ছিন্ন দ্বীপগুলি রাখেন এবং সেগুলি একই বৈশিষ্ট্যের অংশ হয়, আপনি পরবর্তী চেষ্টা করতে পারেন:

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()

এটি আমার পক্ষে কাজ করে। কোনও আকারের যথাযথ "অংশগুলি" কোনও বৈশিষ্ট্যের ভিতরে বিভিন্ন জ্যামিতির সূচনা সূচকগুলি দেয় returns


2

জিওপাণ্ডা বা পাইশপ ব্যবহার করে এটি করা যেতে পারে যা এই উত্তরে আলোচনা করা হয়েছে । জিওপ্যান্ডারা প্লট করার জন্য ব্যাকএন্ডে ম্যাটপ্লটলিব ব্যবহার করে।


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]))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.