ArcPyを使用して投影点の緯度と経度を取得しますか?[閉まっている]


13

ArcPyからアクセスされているフィーチャクラスにポイントフィーチャがあります。ポイントは投影されますが、このポイントの未投影の緯度と経度を取得する効率的な手段を見つける必要があります。

再投影(投影解除)、新しいフィーチャクラスで検索カーソルを取得、フィーチャを検索、およびフィーチャの形状から緯度経度を取得する以外の方法はありますか?

回答:



6

その他の回答のほとんどは、ArcGIS 10.0が最新のソフトウェアであったときに投稿されました。ArcGIS 10.1では、多くの新しいArcPy機能が利用可能になりました。この答えは、その新しい機能を利用しています。10.0には適していませんが、10.1以降ではパフォーマンスと機能が向上しています。

import arcpy

input_feature_class = 'C:\your_feature_class.shp'
wkid = 4326 # wkid code for wgs84
spatial_reference = arcpy.SpatialReference(wkid)

fields_to_work_with = ['SHAPE@']

with arcpy.da.SearchCursor(input_feature_class,
                           fields_to_work_with) as s_cur:
    for row in s_cur:
        point_in_wgs84 = row[0].projectAs(spatial_reference)
        print point_in_wgs84.firstPoint.X, point_in_wgs84.firstPoint.Y

このコードスニペットは、文字列表現を入力するのではなく、wkid使用して空間参照オブジェクト作成し、最新のデータアクセスカーソルを使用し、projectAs()メソッドを使用して個々のジオメトリオブジェクトを投影します


いい答え。WGS84では一般的な順序が緯度/
経度

さらに簡単に、これを行うだけです。srs = arcpy.SpatialReference(4326)xy_coords = arcpy.da.FeatureClassToNumPyArray(input_feature_class、 'SHAPE @ XY'、spatial_reference = srs)print(xy_coords)
dfresh22

5

Jamesの提案を詳しく説明するために、Python / arcpyを使用した最小限のコード例を示します。

import arcpy

def main():
    projectedPointFC = r'c:\point_test.shp'
    desc = arcpy.Describe(projectedPointFC)
    shapefieldname = desc.ShapeFieldName

    rows = arcpy.SearchCursor(projectedPointFC, r'', \
                              r'GEOGCS["GCS_WGS_1984",' + \
                              'DATUM["D_WGS_1984",' + \
                              'SPHEROID["WGS_1984",6378137,298.257223563]],' + \
                              'PRIMEM["Greenwich",0],' + \
                              'UNIT["Degree",0.017453292519943295]]')

    for row in rows:
        feat = row.getValue(shapefieldname)
        pnt = feat.getPart()
        print pnt.X, pnt.Y

if __name__ == '__main__':
    main()

4

投影と呼ぶかどうかにかかわらず、定義により、ある空間参照系から別の空間参照系に座標値を変換する場合、再投影することは間違いありません。

私はArcPyにそれほど詳しくはありませんが、9.3のarcgisscriptingでは、フィーチャクラス全体を投影する必要があります。

必要な投影/変換アルゴリズムの複雑さに応じて、基本的なPython数学の座標の独自の投影をいつでも実行できます。これにより、フィーチャレベルで値の投影を調整できます。

OGR pythonバインディングの使用にオープンであった場合、「検索カーソル」などの機能レベルで機能レベルで投影できます。


残念ながら、使用しているスクリプトで非ESRIのものを使用することはできません。にもかかわらずさえESRIは使用していますOGRとGDAL(右、誰にも言わないのですか?)...
ケントンW

実際、より良いルートは、入力座標でPROJ4を直接使用する方法をなんとかすることです。
ケントンW

@Kenton-(既存のコードに基づく)独自のカスタムアルゴリズムも含まれていますか?UTM-> WGS84に変換する必要がある場合は、Pythonでそれを行うコードを投稿できます。または、必要なアルゴリズムをProj4から抽出し、代わりに使用することもできます。または、ESRIコードの使用に本当に制約されている場合(提案されたようなフィーチャクラス全体を投影したくない場合)、ArcObjectsを使用して投影する単純なCライブラリを作成し、ctypesを使用してPythonから呼び出します。またはarcpyを使い続けて、フィーチャクラス全体を投影します。(
ササイヴェティック

@Kenton-クイック検索はpyproj(code.google.com/p/pyproj)を返します。Python を使用してProj4ライブラリを呼び出す方法の例については、それを参照してください。
ササイヴェティック

@Kenton-UTM NAD83 =>データム変換のない地理的WGS84投影の場合、純粋なPythonでアルゴリズムを実装できるはずです。方程式はSnyderの本にあります: onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf コードが必要な場合、これを行うOracle PL / SQL関数があります。私は、Pythonにポートにこの機能を意味するが、通常はOGR / OSR ...を使用してきた
DavidF

4

ArcPy 10.0では、個々のジオメトリを投影する機能はありません。ただし、ディスク上のワークスペースまたはどこかのデータベースの本格的なフィーチャクラスの代わりに、フィーチャセット(またはメモリ内フィーチャクラス)を作成し、それを投影できます。


それはまさに避けたいと思っていたものです。...私はあなたがArcObjectsのと.NETで取得することができ、電源をご希望の作り
ケントンW

0

フィーチャクラスを作成したくないと思う主な理由は、arcpy.CreateFeatureclass_managementが遅くなる可能性があるためです。また、arcpy.da.NumPyArrayTofeatureClassを使用することもできます。これは、in_memoryフィーチャクラスに対してほぼ瞬時です。

In [1]: import arcpy

In [2]: import numpy as np

In [3]: geosr = arcpy.SpatialReference('Geographic Coordinate Systems/Spheroid-based/WGS 1984 Major Auxiliary Sphere')

In [4]: tosr = arcpy.SpatialReference('Projected Coordinate Systems/World/WGS 1984 Web Mercator (auxiliary sphere)')

In [5]: npai=list(enumerate(((-115.12799999956881, 36.11419999969922), (-117, 38.1141))))

In [6]: npai
Out[6]: [(0, (-115.12799999956881, 36.11419999969922)), (1, (-117, 38.1141))]

In [7]: npa=np.array(npai, np.dtype(([('idfield', np.int32), ('XY', np.float, 2)])))

In [8]: npa
Out[8]: 
array([(0, [-115.12799999956881, 36.11419999969922]),
       (1, [-117.0, 38.1141])], 
      dtype=[('idfield', '<i4'), ('XY', '<f8', (2,))])

In [9]: fcName = arcpy.CreateScratchName(workspace='in_memory', data_type='FeatureClass')

In [10]: arcpy.da.NumPyArrayToFeatureClass(npa, fcName, ['XY'], geosr)

In [11]: with arcpy.da.SearchCursor(fcName, 'SHAPE@XY', spatial_reference=tosr) as cur:
    ...:     print list(cur)
    ...:     
[((-12815990.336048, 4316346.515041453),), ((-13024380.422813002, 4595556.878958654),)]

-1
import arcpy
dsc = arcpy.Describe(FC)
cursor = arcpy.UpdateCursor(FC, "", "Coordinate Systems\Geographic Coordinate   Systems\World\WGS 1984.prj")
for row in cursor:
  shape=row.getValue(dsc.shapeFieldName)
  geom = shape.getPart(0)
  x = geom.X
  y = geom.Y
  row.setValue('LONG_DD', x)
  row.setValue('LAT_DD', y)
  cursor.updateRow(row)

del cursor, row
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.