есть ли шанс изменить проекцию для geojson (mapshaper)

  • Привет всем,
  • Я использую OpenLayers 5, Angular 6, инструмент mapshaper (преобразование shp в json).
  • MapshaperTool, Код Git

мой процесс

  • я установил npm mapshaper --save
  • Я могу загружать разные файлы .shp и получать данные о функциях json.

  • у меня есть 2 разных файла .shp [layer-ind.shp, layer-administrator.shp]

  • файл layer-ind.shp загружен, его json дает вроде

{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "LineString", "coordinates": [ [ 75.89355468749999, 18.521283325496277 ], [ 80.6396484375, 19.68397023588844 ] ] } } ] }

  • файл layer-us.shp загружен, его json дает вроде

{ "type": "FeatureCollection", "features": [ { "type":"Feature", "geometry":{ "type":"LineString", "coordinates":[ [-349771.1875,445307.8125], [-349789.6875,445314.375], [-349796.5625,445321.5625], [-349792.78119999915,445341.4375], [-349786.53119999915,445351.71880000085], [-349771.1875,445307.8125]]}, "properties":{ "TYPE":"ISLAND","RuleID":3, "Shape_Leng":544.475438955 } } ] }

при предварительном просмотре этих двух слоев (объектов) предварительный просмотр на карте 1. Файл layer-ind.json дает правильные результаты и позволяет видеть слой на карте в правильном месте 2. Файл layer-us.json показывает неправильное место на карте (0,0)

  • как решить эту проблему с 2-й точкой Layer-us.json, я также изменил повторную проекцию, как

const vectorSource = new VectorSource({ features: (new GeoJSON()).readFeatures(geojson, { featureProjection: 'EPSG:4326' }); });

  • Я также изменил код featureProjection, но это не рабочий слой-us.json.
  • пожалуйста, помогите с этим

  • спаси мои дни


person kks    schedule 28.02.2019    source источник
comment
Layer-us.shp должен иметь файл layer-us.prj. Откройте его в текстовом редакторе и укажите его содержимое.   -  person pavlos    schedule 01.03.2019
comment
это содержимое .prj PROJCS["NAD_1983_California_Teale_Albers",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Albers"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",-4000000.0],PARAMETER["Central_Meridian",-120.0],PARAMETER["Standard_Parallel_1",34.0],PARAMETER["Standard_Parallel_2",40.5],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]   -  person kks    schedule 03.03.2019


Ответы (1)


Вам нужно будет указать проекцию данных, а также проекцию объекта. featurePprojection - это проекция вашей карты. dataProjection - это проекция координат в json. Я вижу, что dataProjection для layer-ind - это 'EPSG: 4326', dataProjection для layer-us, похоже, использует координаты локальной проекции. Вы знаете, в каком выступе или где находится остров?

const vectorSource = new VectorSource({
        features: (new GeoJSON()).readFeatures(geojson, {
        dataProjection: 'xxxx',
        featureProjection: 'yyyy'
      })
    });

На основе определения проекции, которое вы сейчас дали, вот рабочий образец (для запуска здесь используется полный синтаксис сборки)

proj4.defs('NAD_1983_California_Teale_Albers', 'PROJCS["NAD_1983_California_Teale_Albers",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Albers"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",-4000000.0],PARAMETER["Central_Meridian",-120.0],PARAMETER["Standard_Parallel_1",34.0],PARAMETER["Standard_Parallel_2",40.5],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]');

ol.proj.proj4.register(proj4);

geojson = {
  "type": "FeatureCollection",
  "features": [
{
  "type":"Feature",
  "geometry":{
    "type":"LineString",
    "coordinates":[
      [-349771.1875,445307.8125],
      [-349789.6875,445314.375],
      [-349796.5625,445321.5625],
      [-349792.78119999915,445341.4375],
      [-349786.53119999915,445351.71880000085],
      [-349771.1875,445307.8125]]},
  "properties":{
    "TYPE":"ISLAND","RuleID":3,
    "Shape_Leng":544.475438955
  }
}
  ]
}

var map = new ol.Map({
  layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ],
  target: 'map',
  view: new ol.View()
});


const vectorSource = new ol.source.Vector({
    features: (new ol.format.GeoJSON()).readFeatures(geojson, {
    dataProjection: 'NAD_1983_California_Teale_Albers',
    featureProjection: map.getView().getProjection()
  })
});


map.addLayer(new ol.layer.Vector({source: vectorSource}));

map.getView().fit(vectorSource.getExtent());
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.5.0/proj4.js"></script>

<div id="map" class="map"></div>

person Mike    schedule 28.02.2019
comment
спасибо, я пробовал, но не повезло .. Слой отображается в позиции 0,0 - person kks; 01.03.2019
comment
Вы не можете использовать его, пока не узнаете прогноз и не замените «xxxx» и «yyyy» на правильные значения. Вам также нужно будет определить проекцию с помощью proj4. - person Mike; 01.03.2019
comment
я пробовал, proj4.defs('EPSG:4326', '+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 ' + '+x_0=600000 +y_0=200000 +ellps=bessel ' + '+towgs84=660.077,13.551,369.344,2.484,1.783,2.939,5.66 +units=m +no_defs'); register(proj4); const swissProjection = getProjection('EPSG:4326'); потом featureProjection: swissProjection - person kks; 03.03.2019
comment
попробуйте добавить это - ›_ 1_, а затем использовать в своем векторном источникеdataProjection: 'SR-ORG:10', найденном здесь -› пространственная привязка .org / ref / sr-org / 10 - person pavlos; 04.03.2019
comment
@pavlos OpenLayers может использовать определения WKT напрямую, начиная с версии 3 openlayers.org/en/v3.20.1/examples/scaleline-indiana-east.html Если вы запустите фрагмент, вектор будет размещен на острове. - person Mike; 04.03.2019
comment
Это правильно. Я немного сбит с толку, пользователь хочет использовать прогноз, приведенный выше, но он настраивает EPSG:4326 вместо того, который вы предлагаете. Поэтому я решил дать ему второй вариант. - person pavlos; 04.03.2019