Проверьте, находится ли форма десятичной широты и долготы, которая использует ETRS89 или WGS84 - PullRequest
1 голос
/ 06 мая 2019

Я использую recintos_municipales_inspire_canarias_wgs84/recintos_municipales_inspire_canarias_wgs84.shp (Пиренейский полуостров) и recintos_municipales_inspire_peninbal_etrs89/recintos_municipales_inspire_peninbal_etrs89.shp (Канария) из http://centrodedescargas.cnig.es/CentroDescargas/descargaDir?codSerie=NGMEN&secDescDirCata=9000029

recintos_municipales_inspire_canarias_wgs84.shp в WGS84, а recintos_municipales_inspire_peninbal_etrs89/recintos_municipales_inspire_peninbal_etrs89.shp в ETRS89.

Эти .shp содержат испанские муниципалитеты.

Мои входные данные представляют собой координаты в десятичной широте и долготе (например, используемые карты Google), и я хочу найти форму и записать, где каждый из этихкоординаты для того, чтобы узнать, какой это муниципалитет.

Мой код:

import os
from glob import iglob

import shapefile
from shapely.geometry import Point, shape


class Limites:
    def __init__(self):
        self.loaded = False
        self.mum_shape = None
        self.cache = None
        self.municipios = None
        self.shp_glob = "fuentes/fomento/shp/**/recintos*municipales*.shp"
        self.load()

    def load(self):
        self.mum_shape = {}

        for _shp in iglob(self.shp_glob):
            with shapefile.Reader(_shp) as shp:
                for sr in shp.shapeRecords():
                    if sr.shape.points and sr.record and len(sr.record) > 4:
                        natcode = sr.record[4]
                        cod_provincia = natcode[4:6]
                        cod_municipio = natcode[6:11]
                        if cod_municipio.isdigit():
                            # cod_municipio is the code of the municipality
                            self.mum_shape[cod_municipio] = shape(sr.shape)

    def get_mun(self, *args):
        if len(args) == 1:
            lon, lat = args[0]
        else:
            lat, lon = args

        if lat is None or lon is None:
            return None

        # Notice I don't transform my inputs coordinates
        pt = Point(lon, lat)
        for cod, shape in self.mum_shape.items():
            if pt.within(shape):
                self.cache[key] = cod
                return cod

        return None

так:

api = Limites()
for lat, lon in examples:
    cod = api.get_mun(lat, lon)
    print(cod, lat, lon)

дайте мне:

01002 42.95475500825238 -2.988995546398232
01002 42.96862577694547 -3.022636472021145
01002 43.01779066005873 -3.001256392041849
01002 43.01783568741503 -2.9989983257369985
50297 41.68840665639695 -0.8945899329424668
50297 41.689351183011986 -0.9589016255236483
50297 41.68976237242881 -0.9076274079177915
50297 41.69019415400018 -0.8390439978717974
50297 41.690921990476305 -0.922432326986155
50297 41.69238834082928 -0.8931229785130677
53078 42.2631347430172 -1.6029643041098365
53078 42.26376312876644 -1.5822540065813446
53078 42.27154088788224 -1.5980980328636185
53078 42.2779123426699 -1.5772436099894478
53081 42.7410587024739 -2.267269166087958
53083 42.59430339419461 -2.133990314570195
53083 42.594328861144895 -2.134977234866234
53083 42.61983800152092 -2.104055019644161
38001 28.133993662846912 -16.69357822817092
38001 28.139638024553733 -16.69034791418032
38001 28.185697236251013 -16.688464429796745
38001 28.189354928925457 -16.664676386985626
38001 28.190015481472468 -16.664533830343355
38001 28.191111255764703 -16.66422484905208
38001 28.191757434108634 -16.668227889664106
38001 28.19182683901162 -16.6669760521866
38001 28.19183814632877 -16.668269888310906
38001 28.192262118364244 -16.665322432092907
38001 28.19524516870002 -16.67084908665734
38002 28.128412629492587 -17.255581295691577
38003 28.092813797776806 -17.24746964788173
38004 28.342082282040078 -16.478254250380807
38004 28.352159982147626 -16.430341675149016
38004 28.352604993420737 -16.474145707171267
38004 28.354862772153275 -16.437662467058136
38004 28.355010569096088 -16.43905199442764
38004 28.35504746348884 -16.466925550386925

и это выглядит довольно хорошо, но я не знаю, почему это работает.Я имею в виду, разве вы не должны конвертировать координаты перед их проверкой?Я не знаю, если shapely сделает это для меня, или я что-то упустил.

...