質問

(LAT、LON)から(LON、LAT)へのこのJSON応答の座標の順序を逆にしたい:

url='https://www.sciencebase.gov/catalogMaps/mapping/ows/5342c5fce4b0aa151574a8ed?\
service=wfs&version=1.1.0&request=GetFeature&typeNames=sb:Conservation_Zone_WGS84&outputFormat=application/json'
response = requests.get(url).json()   
print response

{u'crs': {u'properties': {u'code': u'4326'}, u'type': u'EPSG'},
 u'features': [{u'geometry': {u'coordinates': [[[[39.81487959537135,
        -74.09688169446223],
       [39.81488113835475, -74.09587338924456],
       [39.8143317590967, -74.09614209870023],
       [39.8137616151959, -74.09633047532941],
       [39.812950626580545, -74.09670529470912],
       [39.8120075697193, -74.09698124228382],
       [39.814255381955064, -74.0973277412355],
       [39.81487959537135, -74.09688169446223]]]],
    u'type': u'MultiPolygon'},
   u'geometry_name': u'the_geom',
   u'id': u'Conservation_Zone_WGS84.1',
   u'properties': {u'ID': 1,
    u'NAME': u'Sedge Island Marine Conservation Zone',
    u'OBJECTID': 1,
    u'SHAPE_AREA': 70259289.0821,
    u'SHAPE_LEN': 40592.8006466,
    u'WEB_LINK': u'http://www.state.nj.us/dep/fgw/sedge.htm'},
   u'type': u'Feature'}],
 u'type': u'FeatureCollection'}
.

これをブリュートに乗せ、それを一緒に貼り付けることができましたが、私は疑問に思います:構造を解放しながら注文を変える良いPythonicの方法は何でしょうか?

役に立ちましたか?

解決

geojsonのために機能する必要があるnumpyを使用したソリューション。それはすべての「座標」を反転します。

import json
import requests
import numpy as np


def flip_geojson_coordinates(geo):
    if isinstance(geo, dict):
        for k, v in geo.iteritems():
            if k == "coordinates":
                z = np.asarray(geo[k])
                f = z.flatten()
                geo[k] = np.dstack((f[1::2], f[::2])).reshape(z.shape).tolist()
            else:
                flip_geojson_coordinates(v)
    elif isinstance(geo, list):
        for k in geo:
            flip_geojson_coordinates(k)

url = "https://www.sciencebase.gov/catalogMaps/mapping/ows/5342c5fce4b0aa151574a8ed?\
service=wfs&version=1.1.0&request=GetFeature&typeNames=sb:Conservation_Zone_WGS84&outputFormat=application/json"
resp = requests.get(url)
gj = json.loads(resp.text)

print gj
flip_geojson_coordinates(gj)
print gj
.

他のヒント

well ...あなたの座標リストに掘り下げるとこれが取ります:

d['features'][0]['geometry']['coordinates'][0][0]
.

それを逆転させるためにこれを行う必要があります:

d['features'][0]['geometry']['coordinates'][0][0] = [i[::-1] for i in d['features'][0]['geometry']['coordinates'][0][0]]
.

またはビットクリーナーIMO:

for l in d['features'][0]['geometry']['coordinates'][0][0]:
    l.reverse()
.

リストの理解を使用し、結果を構造体に再割り当てします。

ここにいくつかのリストがありますので、いくつかのループが必要です。

for feature in response['features']:
    feature['geometry']['coordinates'] = [[
        [[long, lat] for lat, long in coords] for coords in poly]
        for poly in feature['geometry']['coordinates']]
.

'coordinates'の構造は安定していると思います。'type'キーもあることがわかりますが、u'MultiPolygon以外の種類が使用されている場合は、構造体の変更方法を変更する必要があります。

これはデータを次のように移動します。

>>> pprint.pprint(response)
{u'crs': {u'properties': {u'code': u'4326'}, u'type': u'EPSG'},
 u'features': [{u'geometry': {u'coordinates': [[[[39.81487959537135,
                                                  -74.09688169446223],
                                                 [39.81488113835475,
                                                  -74.09587338924456],
                                                 [39.8143317590967,
                                                  -74.09614209870023],
                                                 [39.8137616151959,
                                                  -74.09633047532941],
                                                 ....
                                                 [39.814255381955064,
                                                  -74.0973277412355],
                                                 [39.81487959537135,
                                                  -74.09688169446223]]]],
                              u'type': u'MultiPolygon'},
                u'geometry_name': u'the_geom',
                u'id': u'Conservation_Zone_WGS84.1',
                u'properties': {u'ID': 1,
                                u'NAME': u'Sedge Island Marine Conservation Zone',
                                u'OBJECTID': 1,
                                u'SHAPE_AREA': 70259289.0821,
                                u'SHAPE_LEN': 40592.8006466,
                                u'WEB_LINK': u'http://www.state.nj.us/dep/fgw/sedge.htm'},
                u'type': u'Feature'}],
 u'type': u'FeatureCollection'}
.

to:

>>> pprint.pprint(response)
{u'crs': {u'properties': {u'code': u'4326'}, u'type': u'EPSG'},
 u'features': [{u'geometry': {u'coordinates': [[[[-74.09688169446223,
                                                  39.81487959537135],
                                                 [-74.09587338924456,
                                                  39.81488113835475],
                                                 [-74.09614209870023,
                                                  39.8143317590967],
                                                 [-74.09633047532941,
                                                  39.8137616151959],
                                                 ....
                                                 [-74.0973277412355,
                                                  39.814255381955064],
                                                 [-74.09688169446223,
                                                  39.81487959537135]]]],
                              u'type': u'MultiPolygon'},
                u'geometry_name': u'the_geom',
                u'id': u'Conservation_Zone_WGS84.1',
                u'properties': {u'ID': 1,
                                u'NAME': u'Sedge Island Marine Conservation Zone',
                                u'OBJECTID': 1,
                                u'SHAPE_AREA': 70259289.0821,
                                u'SHAPE_LEN': 40592.8006466,
                                u'WEB_LINK': u'http://www.state.nj.us/dep/fgw/sedge.htm'},
                u'type': u'Feature'}],
 u'type': u'FeatureCollection'}
.

あなたの「Pythonic」コードは読めませんし、うまくいきません。簡単、愚かな!

def swapCoords(x):
    out = []
    for iter in x:
        if isinstance(iter, list):
            out.append(swapCoords(iter))
        else:
            return [x[1], x[0]]
    return out



for feature in response['features']:
    feature['geometry']['coordinates'] = swapCoords(feature['geometry']['coordinates'])
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top