การแม็พใจความอย่างง่ายของ Shapefile โดยใช้ Python?


37

ฉันต้องการแสดงข้อมูลทางภูมิศาสตร์ใน Python โดยไม่ต้องใช้ ArcGIS / ArcPy และสร้างแผนที่

บนอินเทอร์เน็ตฉันพบวิธีทำแผนที่เฉพาะเรื่องโดยใช้ Python :

นี่คือรหัสที่ฉันลอง:

import shpUtils
import matplotlib.pyplot as plt

shpRecords = shpUtils.loadShapefile('C:\\Users\\shapefile.shp')

for i in range(0,len(shpRecords)):
    x = []
    y = []
    for j in range(0,len(shpRecords[i]['shp_data']['parts'][0]['points'])):

    tempx = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['x'])
    tempy = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['y'])
    x.append(tempx)
    y.append(tempy)
    plt.fill(x,y)

plt.axis('equal')
plt.title("Testing")
plt.show()

อย่างไรก็ตามเมื่อฉันเรียกใช้มันจะให้สีแบบสุ่มแก่ฉัน

ถ้าฉันต้องการเห็นคอลัมน์ของแฟ้มข้อมูลรูปร่างฉันจะใช้สิ่งนี้โดยใช้รหัสที่คล้ายกันได้อย่างไร

สิ่งนี้ไม่ชัดเจนในลิงก์ที่ให้ไว้ข้างต้นซึ่งเขากล่าวถึงการใช้สีเท่านั้น ...

ฉันจะอาจจะต้องโมดูลพิเศษเพื่อให้บรรลุนี้เช่นDescartesและPySAL ?

คำตอบ:


61

ฉันไม่รู้จัก ArcPy แต่ฉันทำงานกับ shapefiles และ raster ใน Python เป็นเวลาหลายปี

  1. สำหรับการประมวลผล shapefiles ใน Python มีโมดูลมากมายเช่นosgeo / ogr , Fiona , PysalหรือPyshp ( shpUtilsเป็นหนึ่งในนั้นและไม่ได้ใช้มากที่สุด) และอื่น ๆ ดูPypi: GISและตัวอย่างบน gis.stackexchange และตัวอย่างมากมายบน เว็บ (ไม่เพียง แต่เป็นภาษาอังกฤษ) ส่วนใหญ่มีอายุมากกว่า ArcPy (หรือ arcgisscripting) ...
  2. สำหรับการประมวลผลแรสเตอร์คุณสามารถใช้osgeo / gdalซึ่งเป็นมาตรฐาน
  3. สำหรับการประมวลผลรูปทรงเรขาคณิตเชิงพื้นที่มีหุ่นดี
  4. สำหรับการพล็อตรูปทรงเรขาคณิตคุณสามารถใช้matplotlibและdescartes ที่อาจเป็น"ส่วนขยาย" ของ matplotlib สำหรับพื้นที่ แต่ยังมีโมดูลอื่น ๆ อีกมากมายดู Pypi: การพล็อตและโมดูลเช่นmayaviสำหรับการแสดง 3 มิติ (matplotlib ด้วย)
  5. นอกจากนี้ยังมีโมดูลเช่น Mapnikที่ให้คุณโดยตรงเป็นไปได้ของ 1) อ่าน shapefile และ 4) การวางแผนกับโมดูลPycairo

หลังจากนั้นก็เหมือน GIS:

  • คุณใช้โมดูล 1) เพื่อเปิดบันทึกรูปร่างและทำทรีทเม้นต์กับโมดูลอื่นเช่น numpy หรือ scipy หากคุณต้องการ
  • คุณสามารถใช้หุ่นดีสำหรับการจัดการและวิเคราะห์วัตถุเรขาคณิต (บัฟเฟอร์ ฯลฯ )
  • คุณสามารถใช้ matplotlib เพื่อพล็อตรูปทรงเรขาคณิต แต่ matplotlib ไม่ทราบว่าคุณต้องการพล็อตอะไร เป็นงานของคุณกับโมดูล 1) หรือ 3) เพื่อระบุสิ่งที่ต้องพล็อต (คุณลักษณะ ฯลฯ ) และวิธีการ

ถ้าฉันต้องการเห็นคอลัมน์ของแฟ้มข้อมูลรูปร่างฉันจะใช้สิ่งนี้ในรหัสได้อย่างไร

ดังนั้นคุณต้องเรียนรู้ matplotib และโมดูลอื่น ๆ คุณต้องเรียนรู้ ArcPy มันเหมือนกัน ... (มีบทเรียนที่ยอดเยี่ยมมากมายบนเว็บโดยเฉพาะสำหรับ matplolib และมันง่ายกว่าที่ ArcPy เพราะมันเป็น Python บริสุทธิ์)

ตัวอย่างบางส่วนที่มี Python เท่านั้น

ป้อนคำอธิบายรูปภาพที่นี่

แผนที่ทางธรณีวิทยา (ไฟล์รูปหลายเหลี่ยม) ที่มีสีตามคุณลักษณะ

ป้อนคำอธิบายรูปภาพที่นี่

คะแนน 3D (ShapeZ Shapefile) ที่มีสีตามคุณสมบัติ

ป้อนคำอธิบายรูปภาพที่นี่

จุด 3 มิติ (จุด Shapefile ที่มี z เป็นแอตทริบิวต์) และเส้น 3 มิติ (PolyLineZ Shapefile) บน DEM และบนแรสเตอร์จะพาดลงบนพื้นผิว DEM

ป้อนคำอธิบายรูปภาพที่นี่

โปรไฟล์ภูมิประเทศที่มีค่า z และสีตามคุณลักษณะ (การก่อตัวทางธรณีวิทยา = ส่วนตัดขวาง) ของรูปร่างดั้งเดิม (Polyline Shapefile)

ป้อนคำอธิบายรูปภาพที่นี่

DEM (GeoTIFF) พร้อมโมดูล Mayavi2

ป้อนคำอธิบายรูปภาพที่นี่

DEM (ESRI ascii grid, .asc) และ Point shapefiles (ที่มี z เป็นคุณลักษณะ) พร้อมโมดูลvisvis

ป้อนคำอธิบายรูปภาพที่นี่

เจาะ (3D buffer ของ polylineZ ที่มีสีขึ้นอยู่กับแอตทริบิวต์ (ก่อตัวทางธรณีวิทยา) ที่มีพื้นผิวตารางคำนวณด้วยโมดูล numpy matplotlib และจากจุด shapefile (กับ Z เป็นแอตทริบิวต์) มองเห็นด้วยโมดูลvisvis


16

ฉันมีปัญหาคล้าย ๆ กันซึ่งฉันต้องการเห็นรูปร่างของไฟล์ได้อย่างรวดเร็วและฉันก็พบว่าวิธี Matplotlib เป็นวิธีที่ค่อนข้างยาวในการทำภารกิจเล็ก ๆ ให้สำเร็จ แต่ฉันได้พัฒนาโมดูล "Python Geographic Visualizer"หรือ GeoVis สั้น ๆ อัปเดต: v0.2.0 เปิดตัวพร้อมฟังก์ชั่นใหม่มากมาย

ด้วยการเห็นภาพรูปร่างได้ง่ายกว่า:

import geovis
geovis.ViewShapefile("C:/yourshapefile.shp")

Voila คุณแมปปรากฏขึ้นเป็นภาพในหน้าต่าง Tkinter และคุณยังสามารถบันทึกแผนที่ไปยังไฟล์ภาพ คุณสามารถจัดแต่งทรงผมระบายสีและเพิ่มเลเยอร์หลายชั้นในแผนที่และในเวอร์ชั่นใหม่ล่าสุดคุณยังสามารถจัดประเภทตามคุณลักษณะและซูมเข้าสู่ภูมิภาคที่ต้องการ ในแผนที่ด้านล่าง geovis ได้รับการโหลดและระบายสี GADM ทุกจังหวัดของโลกในเวลาประมาณ 5 นาที คุณสามารถดาวน์โหลด GeoVis ได้จากที่นี่ซึ่งคุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิธีการใช้

ป้อนคำอธิบายรูปภาพที่นี่

จุดมุ่งหมายคือการติดตั้งง่ายเท่าที่ใช้งานง่ายดังนั้นทุกคนที่มี Python และ GeoVis สามารถใช้งานได้และไม่ต้องการโมดูลอื่น ๆ เพราะสามารถใช้ Tkinter Canvas ในตัวเป็นตัวเรนเดอร์ แต่ขอแนะนำอย่างยิ่งให้คุณมีหรือได้รับ Aggdraw, PIL หรือ PyCairo ซึ่งสามารถใช้เป็นโหมดเรนเดอร์และมีคุณภาพสูงและเร็วกว่ามาก

Backdraw เป็น shapefile ของคุณจะต้องถูก unprojected ด้วยระบบ lat / long พิกัด - มันยังไม่ได้จัดการกับการคาดการณ์หรือการแปลง


14

1

ใน 2019วิธีที่ง่ายที่สุดที่จะทำให้แผนที่ใจจาก shapefile ในหลามเป็นgeopandas

ตัวอย่างจากเอกสารประกอบ: http://geopandas.org/mapping.html

import geopandas
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['gdp_per_cap'] = world.gdp_md_est / world.pop_est
world.plot(column='gdp_per_cap')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.