أكثر

GeoPandas: إرجاع خط الطول وطول نقطة النقطه الوسطى

GeoPandas: إرجاع خط الطول وطول نقطة النقطه الوسطى


أود إرجاعاللاتولونأوxوذمن كائن النقطة في السلسلة التالية حيث أخطط لربطها بواجهة برمجة التطبيقات التي أنشأتها والتي تربط OSM و NetworkX. سيتم إضافة النقط الوسطى كعقد جديدة لتحليل الشبكة.

gp.GeoSeries (zone.centroid) .x، وgp.GeoSeries (المناطقكما هو موضح في رفع المستنداتAttributeError: كائن "GeoSeries" ليس له سمة "x"خطأ.

تعديل الأشياء قليلاً والطباعةlist (gp.GeoSeries (zone.centroid))إرجاع آلاف النقاط الجميلة بالتنسيق التالي:

[… , , , , , , , ]

الكود الذي أستخدمه هو ما يلي:

استيراد geopandas كمناطق gp = gp.GeoDataFrame.from_file (shp_file) للفهرس ، والصف في المناطق. (-122.7474362519174 53.99998921974029) # 9700100.00 نقطة (-121.4904983300892 53.98447191612864) # 9700101.00 POINT (-122.5513619751679 53.7399.091511078) # 9700102.00 POINT (-121.4904983300892)

كيف يمكنني إرجاعxوذمن كائن GeoPandas POINT؟


ترك الباقي أدناه ، ولكن الشيء الرئيسي هو الوصول إلى الهندسة بشكل صحيح. في حالة التكرار فوق الصفوف ، على سبيل المثالللفهرس ، الصف في المناطق.يمكنك ببساطة استخدامrow.geometry.centroid.xوrow.geometry.centroid.y. الهندسة هي عمود خاص مدرج في GeoDataFrame ، لذلك كل صف له خاصية هندسية.
أنت تقوم بالوصول إلى تلك السمة التي تحتوي على ملفجميلمفعول. الذي - التيجميلالكائن سيكون له سمة ،النقطه الوسطىهذا بدوره يحتوي على ملفرشيق. الهندسة. نقطةالتي لها سماتxوذ، وأخيراً يمنحك الخصائص التي تريدها.


(كان هذا الجزء هو الجهد الأصلي للوصول إلى x و y بـخريطةورشيق. الهندسة. نقطة.)
سأفترض أنك تريد قائمة (x ، y) tuples؟ قم بإنشاء وظيفة وصول سريع للسمات x و y في ملفهدفوالاستخدامخريطة.

تحرير: حسنًا ، اكتشفت أنك قد تصل إلى الشكل الهندسي في GeoDataFrame بطريقة غير صحيحة. الهندسة هي عمود في GeoDataFrame الخاص بك ، والذي ينتج بحد ذاته سلسلة. الاتصالالنقطه الوسطىفي هذا العمود يجب أن يمنحك GeoSeries جديدًا لتلك النقط الوسطى فقط. أظن أن الطريقة التي كنت تسير بها في الأمور كانت تأخذ النقطه الوسطى من كل رأس في كل مضلع. ما زلت لا أستطيع اختبار هذا لأنني لا أستطيع تثبيت GeoPandas في الوقت الحالي.

def getXY (pt): إرجاع (pt.x، pt.y) centroidseries = مناطق ['geometry']. centroid centroidlist = map (getXY، centroidseries)

أو إذا كنت تريد قائمتين منفصلتين لإحداثيات x و y

def getXY (pt): إرجاع (pt.x، pt.y) centroidseries = المناطق ['geometry']. centroid x، y = [list (t) for t in zip (* map (getXY، centroidseries))]

بالتناوب ، يجب أن تكون قادرًا أيضًا على استخدامالمناطق. الهندسةبدلا منالمناطق ["الهندسة"]. في كلتا الحالتين ، أعتقد الاتصالالمناطقربما تقوم بإرجاع GeoDataFrame بدلاً من GeoSeries ، مما يمنحك مخرجات غير متوقعة عند لفها في GeoSeries أخرى.


ركضت في هذه المشكلة بنفسي. إذا كنت تريدxوذكأعمدة GeoDataFrame منفصلة ، فهذا يعمل بشكل جيد:

gdf ["x"] = gdf.centroid.map (lambda p: p.x) gdf ["y"] = gdf.centroid.map (lambda p: p.y)

بدءًا من GeoPandas 0.3.0 ، يمكنك استخدام ملفxوذالخصائص بدلاً من ذلك:

gdf ["x"] = gdf.centroid.x gdf ["y"] = gdf.centroid.y

أصبح هذا أسهل من GeoPandas 0.3.0.

يمكنك الآن الوصول إلى ملفاتxوذمننقاط رشيقةداخلجيوبانداس GeoSeriesاستخدامyour_GeoDataFrame.geometry.xوyour_GeoDataFrame.geometry.y

(ملاحظة: أنا أستخدم python 3.6.1 ، لست متأكدًا من السلوك في الإصدار 2.7 ، آسف)

المصدر على جيثب


الحل لاستخراج النقطة المركزية (خطوط الطول والعرض) من المضلع والمضلع المتعدد.

استيراد geopandas كـ gpd df = gpd.read_file (path + 'df.geojson') # العثور على نقطة الوسط df ['Center_point'] = df ['الهندسة']. centroid #Extract lat and lon from the centerpoint df ["lat "] = df.Center_point.map (lambda p: px) df [" long "] = df.Center_point.map (lambda p: py)

واجهت مشكلة مماثلة ، فقط باستخدام الأشكال الهندسية المضلعة ووجدت أن هذا الحل يعمل بشكل جيد بالنسبة لي ، ضع في اعتبارك أنه يستخدم Python-3.6 لذلك قد لا يعمل مع Python-2.7.

استيراد الجيوباندا كمناطق gpd = gpd.read_file ('file_to_read.shp') لـ i في النطاق (0 ، len (المناطق)): zone.loc [i، 'centroid_lon'] = zone.geometry.centroid.x.iloc [ i] zone.loc [i، 'centroid_lat'] = zone.geometry.centroid.y.iloc [i]

إذا كنت تريد فقط مجموعة صغيرة من النقط الوسطى:

centroids = np.vstack ([df.centroid.x، df.centroid.y]). T

أو كإطار بيانات به أعمدة إضافية (مثل الاسم على سبيل المثال):

pd.DataFrame (np.vstack ([df.name، df.centroid.x، df.centroid.y]). T ، الأعمدة = ['name'، 'x'، 'y'])

السابق.

هندسة الاسم 0 1 POLYGON ((0.00000 1.00000، 0.00000 0.00000، 1… 1 2 POLYGON ((2.00000 1.00000، 2.00000 0.00000، 3… # ==> # np.vstack ([df.centroid.x، df.centroid.y] ) صفيف T # ([[0.5، 0.5]، # [2.5، 0.5]])

هنا سريع

df = pd.read_csv ('data / hospitals.csv') df.columns # 'Ownership'، 'Lat'، 'Long' from shapely.geometry import Point df ['geometry'] = df.apply (صف lambda: نقطة (صف طويل ، صف ، متأخر) ، المحور = 1)

ثم أعد إنشاء إطار البيانات باستخدام الجيوباندا

gdf = gpd.DataFrame (df) # ينشئ إطارًا جغرافيًا مع هندسة النقطة