Почему результаты Google Maps и Matplotlib различаются?

Я построил файл kml с помощью matplotlib и показал его на Картах Google, но линия другая. Может кто-нибудь сказать мне, почему? Как я могу нанести его на карту так же, как на Картах Google?

<?xml version = "1.0" encoding = "UTF-8"?>
<kml xmlns = "http://www.opengis.net/kml/2.2">
  <Document>
    <name>2019年06月05日黄海海阳泰瑞号长征十一号海</name>
    <Style id = "line-000000-1200-normal">
      <LineStyle>
        <color>ff000000</color>
        <width>1.2</width>
      </LineStyle>
    </Style>
    <Style id = "line-000000-1200-highlight">
      <LineStyle>
        <color>ff000000</color>
        <width>1.8</width>
      </LineStyle>
    </Style>
    <StyleMap id = "line-000000-1200">
      <Pair>
        <key>normal</key>
        <styleUrl>#line-000000-1200-normal</styleUrl>
      </Pair>
      <Pair>
        <key>highlight</key>
        <styleUrl>#line-000000-1200-highlight</styleUrl>
      </Pair>
    </StyleMap>
    <Style id = "poly-3949AB-1000-255-normal">
      <LineStyle>
        <color>ffab4939</color>
        <width>1</width>
      </LineStyle>
      <PolyStyle>
        <color>ffab4939</color>
        <fill>1</fill>
        <outline>1</outline>
      </PolyStyle>
    </Style>
    <Style id = "poly-3949AB-1000-255-highlight">
      <LineStyle>
        <color>ffab4939</color>
        <width>1.5</width>
      </LineStyle>
      <PolyStyle>
        <color>ffab4939</color>
        <fill>1</fill>
        <outline>1</outline>
      </PolyStyle>
    </Style>
    <StyleMap id = "poly-3949AB-1000-255">
      <Pair>
        <key>normal</key>
        <styleUrl>#poly-3949AB-1000-255-normal</styleUrl>
      </Pair>
      <Pair>
        <key>highlight</key>
        <styleUrl>#poly-3949AB-1000-255-highlight</styleUrl>
      </Pair>
    </StyleMap>
    <Placemark>
      <name>ZSHA/A2585/19</name>
      <description><![CDATA[description: <br>名前: ]]></description>
      <styleUrl>#line-000000-1200</styleUrl>
      <ExtendedData>
        <Data name = "description">
          <value/>
        </Data>
        <Data name = "名前">
          <value/>
        </Data>
      </ExtendedData>
      <LineString>
        <tessellate>1</tessellate>
        <coordinates>
          121.409097,34.899247,0
          121.407996,34.881579,0
          121.404801,34.864084,0
          121.399542,34.846932,0
          121.392271,34.830286,0
          121.38306,34.814308,0
          121.371999,34.79915,0
          121.359193,34.784958,0
          121.344768,34.771868,0
          121.328861,34.760006,0
          121.311627,34.749485,0
          121.29323,34.740406,0
          121.273848,34.732857,0
          121.253665,34.726909,0
          121.232876,34.722619,0
          121.211679,34.720028,0
          121.190278,34.719162,0
          121.168876,34.720028,0
          121.147679,34.722619,0
          121.12689,34.726909,0
          121.106708,34.732857,0
          121.087325,34.740406,0
          121.068929,34.749485,0
          121.051694,34.760006,0
          121.035788,34.771868,0
          121.021362,34.784958,0
          121.008557,34.79915,0
          120.997495,34.814308,0
          120.988284,34.830286,0
          120.981014,34.846932,0
          120.975755,34.864084,0
          120.972559,34.881579,0
          120.971459,34.899247,0
          120.972466,34.91692,0
          120.975572,34.934426,0
          120.980748,34.951596,0
          120.987946,34.968266,0
          120.997098,34.984274,0
          121.008115,34.999465,0
          121.020893,35.013694,0
          121.03531,35.026821,0
          121.051225,35.038721,0
          121.068487,35.049279,0
          121.086928,35.058391,0
          121.10637,35.06597,0
          121.126625,35.071942,0
          121.147496,35.07625,0
          121.168783,35.078851,0
          121.190278,35.079721,0
          121.211773,35.078851,0
          121.233059,35.07625,0
          121.253931,35.071942,0
          121.274186,35.06597,0
          121.293628,35.058391,0
          121.312069,35.049279,0
          121.32933,35.038721,0
          121.345246,35.026821,0
          121.359662,35.013694,0
          121.37244,34.999465,0
          121.383458,34.984274,0
          121.392609,34.968266,0
          121.399807,34.951596,0
          121.404984,34.934426,0
          121.40809,34.91692,0
          121.409097,34.899247,0
        </coordinates>
      </LineString>
    </Placemark>
    <Placemark>
      <name>ZSHA/A2637/19</name>
      <description><![CDATA[description: <br>名前: ]]></description>
      <styleUrl>#poly-3949AB-1000-255</styleUrl>
      <ExtendedData>
        <Data name = "description">
          <value/>
        </Data>
        <Data name = "名前">
          <value/>
        </Data>
      </ExtendedData>
      <Polygon>
        <outerBoundaryIs>
          <LinearRing>
            <tessellate>1</tessellate>
            <coordinates>
              124,33.680556,0
              123.628889,33.235556,0
              124.598652,32.687742,0
              124.966694,33.118961,0
              124,33.680556,0
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>
    <Placemark>
      <name>RKRR/A0864/19</name>
      <description><![CDATA[description: <br>名前: ]]></description>
      <styleUrl>#poly-3949AB-1000-255</styleUrl>
      <ExtendedData>
        <Data name = "description">
          <value/>
        </Data>
        <Data name = "名前">
          <value/>
        </Data>
      </ExtendedData>
      <Polygon>
        <outerBoundaryIs>
          <LinearRing>
            <tessellate>1</tessellate>
            <coordinates>
              124,33.680556,0
              124,33.023056,0
              124.598652,32.687742,0
              124.966694,33.118961,0
              124,33.680556,0
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>
    <Placemark>
      <name>RJJJ/J2462/19</name>
      <description><![CDATA[description: <br>名前: ]]></description>
      <styleUrl>#poly-3949AB-1000-255</styleUrl>
      <ExtendedData>
        <Data name = "description">
          <value/>
        </Data>
        <Data name = "名前">
          <value/>
        </Data>
      </ExtendedData>
      <Polygon>
        <outerBoundaryIs>
          <LinearRing>
            <tessellate>1</tessellate>
            <coordinates>
              135.728611,25.744722,0
              135.224722,25.186111,0
              136.487549,24.20233,0
              137.016389,24.755556,0
              135.728611,25.744722,0
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>
    <Placemark>
      <name>海上45°轨道</name>
      <description><![CDATA[description: <br>名前: Route]]></description>
      <styleUrl>#line-000000-1200</styleUrl>
      <ExtendedData>
        <Data name = "description">
          <value/>
        </Data>
        <Data name = "名前">
          <value>Route</value>
        </Data>
      </ExtendedData>
      <LineString>
        <tessellate>1</tessellate>
        <coordinates>
          121.1829579,34.9082773,0
          138.2007802,23.3168334,0
        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>

Пожалуйста, прочитайте минимальный воспроизводимый пример и покажите свой код.

Mark Tolonen 30.05.2024 06:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо построить KML-файл, используя Ортогональную картографическую проекцию, чтобы она соответствовала представлению Google:

Один из способов — использовать geoplot :

import geoplot

ax = geoplot.polyplot(
    gpd.read_file("file.kml"), # or gdf's name
    projection=geoplot.crs.Orthographic(),
    figsize=(17, 5),
    facecolor = "cyan",
    zorder=2
)

ax.coastlines()
ax.stock_img()

Если вы строите на основе подзаговоров, вы можете сделать:

gdf = gpd.read_file("file.kml")

xmean, ymean = gdf.centroid.get_coordinates().mean()

proj = geoplot.crs.Orthographic(central_longitude=xmean, central_latitude=ymean)

fig, ax = plt.subplots(figsize=(12, 4), subplot_kw = {"projection": proj})

geoplot.polyplot(
    gdf,
    projection=proj,
    facecolor = "cyan",
    zorder=2,
    ax=ax,
)

ax.coastlines()
ax.stock_img()

Как мне объединить это с моим кодом matplotlib fig, ax = plt.subplots()? –

mikezang 30.05.2024 08:22

У меня ошибка AttributeError: 'Axes' object has no attribute 'set_extent'

mikezang 30.05.2024 09:55

Я добавил правильный способ использования подзаголовков в этом случае. Смотрите обновление.

Timeless 30.05.2024 10:13

Ошибка UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation. xmean, ymean = newPolys.centroid.get_coordinates().mean()

mikezang 30.05.2024 11:48

Я знал об этом до обновления. Это просто предупреждение ;)

Timeless 30.05.2024 12:37

Могу ли я просто показать рамку без цвета для быстрого рендеринга?

mikezang 30.05.2024 12:50

Вы сможете сделать это с помощью facecolor = "none".

Timeless 30.05.2024 12:53

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

mikezang 30.05.2024 13:01

Ваша формулировка была немного двусмысленной, и мы начали отходить от основного вопроса. В любом случае, удалите ax.stock_img(), если фон плитки вам не нужен ;)

Timeless 30.05.2024 13:10

Другие вопросы по теме

Похожие вопросы

Есть ли способ получить массив двоичных чисел без предварительного преобразования его в строку?
Как расшифровать ключ, зашифрованный с помощью пакета натрия R в Python?
К чему относится ошибка «модуль langchain» не имеет атрибута «verbose»?
Почему VS Code показывает встроенные комментарии как часть переменных среды из файла .env?
Как избежать или обойти еженедельный повторный ввод учетных данных для Interactive Broker Gateway (IBGW), чтобы поддерживать соединение?
Оптимизация размещения узлов в 2D-сетке для соответствия определенным геодезическим расстояниям
Проблемы с потоками и горячими клавишами при использовании Pynput в Python (бесконечный цикл и скорость реагирования)
Полярный контурный график с нерегулярными «ячейками»
Почему распаковка списка при индексации является синтаксической ошибкой в ​​Python 3.8, но не в Python 3.12?
Python TypeError: невозможно объединить объект типа '<class 'str'>'; действительны только объекты Series и DataFrame