Notes |
|
(0005527)
|
Tolik
|
16-02-2012 11:29
(edited on: 16-02-2012 11:57) |
|
Вот ещё карта:
http: 195.91.135.30/ArcGIS/rest/services/osi_o/MapServer/export?dpi=96&transparent=true&format=png8&bbox=%7B%22xmin%22%3A16581.53312734728%2C%22ymin%22%3A15576.20119252291%2C%22xmax%22%3A17428.201487350667%2C%22ymax%22%3A16105.368917525027%2C%22spatialReference%22%3A%7B%22wkt%22%3A%22PROJCS%5B%5C%22Moscow%20Coordinate%20System%5C%22%2CGEOGCS%5B%5C%22GCS_Krasovsky_1940%5C%22%2CDATUM%5B%5C%22D_Krasovsky_1940%5C%22%2CSPHEROID%5B%5C%22Krasovsky_1940%5C%22%2C6378245.0%2C298.3%5D%5D%2CPRIMEM%5B%5C%22Greenwich%5C%22%2C0.0%5D%2CUNIT%5B%5C%22Degree%5C%22%2C0.0174532925199433%5D%5D%2CPROJECTION%5B%5C%22Gauss_Kruger%5C%22%5D%2CPARAMETER%5B%5C%22False_Easting%5C%22%2C0.0%5D%2CPARAMETER%5B%5C%22False_Northing%5C%22%2C0.0%5D%2CPARAMETER%5B%5C%22Central_Meridian%5C%22%2C37.4998%5D%2CPARAMETER%5B%5C%22Scale_Factor%5C%22%2C1.0%5D%2CPARAMETER%5B%5C%22Latitude_Of_Origin%5C%22%2C55.667%5D%2CUNIT%5B%5C%22Meter%5C%22%2C1.0%5D%5D%22%7D%7D&size=800%2C500&f=image
Типа Московская СК, куча параметров, и Красовский там, и Гаусс-Крюгер, красота!
И BBOX в 16 км от начала координат 37.4998,55.667 (там находится стоянка автосервиса :)
Отзовитесь, можно ли такое реализовать? И вообще, корректна ли постановка вопроса?
Офтопик: кто знает простой инструмент для перевода всех этих %5C в читабельные символы?
P.S. Ответ: http://meyerweb.com/eric/tools/dencoder/
|
|
|
(0006471)
|
vasketsov
|
24-04-2012 19:00
(edited on: 24-04-2012 19:10) |
|
Terraserver работает в оригинале с проекцией для соответствующей зоны, например, EPSG:32640 соответствует N40, и соответственно для идеальной похожести запросов как-то бы сделать её поддержку (ну и соответственно других аналогичных "зональных" проекций). Хоть бы формулы кто подкинул.
На всякий случай прдублирую тут ссылку на Proj4:
http://trac.osgeo.org/proj/
http://www.triplexware.huckfinn.de/geogfix.html#proj
|
|
|
(0006472)
|
zed
|
24-04-2012 19:57
|
|
>Хоть бы формулы кто подкинул
Как я понимаю, если подключить либу Proj4 то и в формулы вникать не придётся?
А вообще, это мего-хотелка - подключить эту либу и заюзать все доступные проекции одним махом. |
|
|
(0006473)
|
vasketsov
|
24-04-2012 20:21
(edited on: 24-04-2012 20:27) |
|
Ну по идее да.
Но вот только дата последнего обновления DLL в сравнении с датой последнего обновления proj4 совсем не радует.
Вот чего откопалось:
http://spatialreference.org/ref/epsg/32640/
Вправо-влево - соседние зоны.
Третья ссылка в табличке - параметры для proj4.
То есть по идее поддержка 326__ должна быть.
ps. Определённо да. В файлике lib.proj.-4.4.7.r.zip есть API + DLL.
|
|
|
(0006474)
|
zed
|
24-04-2012 21:04
|
|
Судя по размеру и наполнению заголовочников proj4, обновить API до текущей версии не проблема. |
|
|
|
Ну я попробую сначала для наших зон 32630-32660 сделать и поиграться.
Всё равно же придётся писать в zmp что-то типа EPSG:32640, а не '+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'. А там дальше видно будет что к чему. |
|
|
(0006476)
|
vasketsov
|
25-04-2012 09:43
(edited on: 25-04-2012 09:45) |
|
Пришёл к выводу, что даже для обычных проекций надо уметь генерить координаты для запросов с учётом соответствующей зоны. Например projid=32637&xul=370759.308622674&yul=6097520.70703952 для обычного DG (так работает terraserver над globexplore-ром).
Так что всё несколько извращённее.
Либо надо прямо указывать зону в скрипте (типа установить зону, сбросить зону), либо определять её автоматом в скрипте, либо делать настройку для этого в zmp, чтобы все "метрические" функции всегда возвращали координаты в зоне (что мягко говоря не хочется).
|
|
|
|
Сделал интерфейс (точнее даже 2 разных) над proj447.dll, которая должна лежать в папке с сасом. Но работает и без неё. В параметрах карт изменений нет.
Сейчас прикручен интерфейс для конвертации координат в паскальскрипте.
Прикручена общая функциональность, возможно по результатам тестирования сформируется перечень обобщённых функций, которые будут использоваться в большинстве случаев. Но пока что тестируем руками и отписываемся.
Описание интерфейса:
IProj4Conv = interface
function AvailableConv: Boolean; stdcall;
function SetProj(const Args, APath: String): Boolean; stdcall;
function SetEPSG(const AEPSG: Integer): Boolean; stdcall;
function LonLat2XY(const AProjLP: TDoublePoint): TDoublePoint; stdcall;
function XY2LonLat(const AProjXY: TDoublePoint): TDoublePoint; stdcall;
end;
Доступен в скрипте как переменная Proj4Conv типа IProj4Conv.
Пример использования:
var
BL,M: TDoublePoint;
TR,N: TDoublePoint;
VEPSG: Integer;
VCoords: String;
VLeft: Double;
begin
// test proj4
VLeft := GetLLon;
VCoords := RoundEx(VLeft,9)+','+RoundEx(GetBLat,9)+','+RoundEx(GetRLon,9)+','+RoundEx(GetTLat,9);
if (GetAfter('EPSG:4326', GetURLBase) <> '') then begin
// base EPSG:4326 defined in URL
ResultURL:=GetURLBase+VCoords;
end else begin
// no EPSG:4326 - calc utm zone
VEPSG := (Round(VLeft) div 6) + 32631;
Proj4Conv.SetEPSG(VEPSG);
if Proj4Conv.AvailableConv then begin
// use current zone
BL.x := VLeft;
BL.y := GetBLat;
TR.x := GetRLon;
TR.y := GetTLat;
M := Proj4Conv.LonLat2XY(BL);
N := Proj4Conv.LonLat2XY(TR);
ResultURL:=GetURLBase+RoundEx(M.x,9)+','+RoundEx(M.y,9)+','+RoundEx(N.x,9)+','+RoundEx(N.y,9)+'&SRS=EPSG:'+IntToStr(VEPSG);
end else begin
// not available - force EPSG:4326
ResultURL:=GetURLBase+VCoords+'&SRS=EPSG:4326';
end;
end;
end.
Смысл примера:
Если в УРЛе есть строка 'EPSG:4326' - то используем её, иначе определяем проекцию и устанавливаем (через фнкцию SetEPSG), но если же проекция по какой-либо причине недоступна - то опять же возвращаемся к использованию EPSG:4326.
Установка проекции выполняется либо указанием номера EPSG (первый способ), либо через функцию SetProj с передачей ей всех параметров (второй способ). Первый способ внутри вызывает второй (пока что только если значение EPSG между 32630 и 32660) как SetProj('+proj=utm +zone='+IntToStr(AEPSG-32600)+' +ellps=WGS84 +datum=WGS84 +units=m +no_defs', '')
Подробности описания параметров в приаттаченном архиве. оттуа же взять DLL и при необходимости папку nad. |
|
|
|
Артефактов при скачке одного и того же участка качаемого мной снимка в EPSG:4326
и в EPSG:32640 я не заметил, но он далеко от границы зоны.
Кроме того, сейчас пока что есть неоптимальность, что конвертер грохается и создаётся заново, как будет понятно что к чему - будем исправлять эту кривоту, чтобы он мог жить своей жизнью. |
|
|
|
Ну чего, кто-то пользуется? Косяки находили?
А то я вовсю юзаю... ошибку нашёл в примере - надо не
VEPSG := (Round(VLeft) div 6) + 32631;
а
VEPSG := (Trunc(VLeft) div 6) + 32631;
Какие-то номера проекций или диапазоны добавить?
По поводу реализации - оставить как есть (конвертер грохается и создаётся заново), или например сделать его как свойство у IConverter (и тогда он будет доступен везде в коде, и будет создаваться только по требованию)? |
|
|
(0006790)
|
Tolik
|
05-05-2012 17:56
|
|
vasketsov, вы б как-то подоступнее объяснили, как этим пользоваться. Рабочий пример бы приложили. А то я 2 недели назад прочитал, ничего не понял да и забыл. |
|
|
|
Пример в сообщении от (26-04-2012 12:28) рабочий. Что именно там непонятно?
Взят из zmp для T@rras@rv@r.
В DefaultURL есть 'EPSG:4326'. Наличием или отсутствием этого куска определяется формат запросов (а его можно править из саса).
В примере проверяется наличие EPSG:4326 (можно разными способами, здесь GetAfter, можно смело юзать GetBefore).
Если нет - значит запрос строим через зону utm.
Зона (точнее сразу EPSG) определяется как
VEPSG := (Trunc(VLeft) div 6) + 32631;
Далее пытаемся её установить:
Proj4Conv.SetEPSG(VEPSG);
Это работает только если есть proj447.dll, если нет - вернётся FALSE. Но в примере результат не проверяется. Вместо этого отдельная функция проверяет доступность текущей проекции:
if Proj4Conv.AvailableConv then ...
Соответственно если проекция доступна (и некоторые другие проверки также успешны), то заполняем координаты LonLat и вызываем:
Proj4Conv.LonLat2XY
для конвертации в метры в установленной проекции. Соответственно после этого формируем ResultURL на основании результата выполнения LonLat2XY.
Если надо не простые зоны типа EPSG:32640 - то надо вызывать не Proj4Conv.SetEPSG(VEPSG), а функцию
Proj4Conv.SetProj(const Args, APath: String). Но другие проекции я не проверял.
Это пока что сделано только для формирования запросов. |
|
|
(0006799)
|
Tolik
|
05-05-2012 18:21
|
|
Ну а весь рабочий zmp можно получить? |
|
|
(0006800)
|
vasketsov
|
05-05-2012 18:23
(edited on: 05-05-2012 18:27) |
|
>весь рабочий zmp можно получить?
Очевидно нет )))
Да и не зачем.
В params.txt ничего не меняется.
В скрипте (запрос идёт на локальный проксик, где вся логика скрыта):
var
TL,M: TDoublePoint;
BR,N: TDoublePoint;
BL,K: TDoublePoint;
TR,L: TDoublePoint;
CC,C: TDoublePoint;
VEPSG: Integer;
begin
TL.x := GetLLon;
TL.y := GetTLat;
BR.x := GetRLon;
BR.y := GetBLat;
BL.x := GetLLon;
BL.y := GetBLat;
TR.x := GetRLon;
TR.y := GetTLat;
CC.x := (GetLLon+GetRLon)/2;
CC.y := (GetTLat+GetBLat)/2;
// get zone
VEPSG := (Trunc(TL.x) div 6) + 32631;
Proj4Conv.SetEPSG(VEPSG);
if Proj4Conv.AvailableConv then begin
// convert
M := Proj4Conv.LonLat2XY(TL);
N := Proj4Conv.LonLat2XY(BR);
K := Proj4Conv.LonLat2XY(BL);
L := Proj4Conv.LonLat2XY(TR);
C := Proj4Conv.LonLat2XY(CC);
// make url
ResultURL := GetURLBase + '&tlx=' + RoundEx(M.x,6) +
'&tly=' + RoundEx(M.y,6) +
'&brx=' + RoundEx(N.x,6) +
'&bry=' + RoundEx(N.y,6) +
'&blx=' + RoundEx(K.x,6) +
'&bly=' + RoundEx(K.y,6) +
'&trx=' + RoundEx(L.x,6) +
'&try=' + RoundEx(L.y,6) +
'&ccx=' + RoundEx(C.x,6) +
'&ccy=' + RoundEx(C.y,6) +
'&llt=' + RoundEx(GetTLat,9) +
'&llb=' + RoundEx(GetBLat,9) +
'&lll=' + RoundEx(GetLLon,9) +
'&llr=' + RoundEx(GetRLon,9) +
'&sps=' + IntToStr(VEPSG) +
'&ver=' + Version;
end else begin
// not available
ResultURL := GetURLBase;
end;
end.
|
|
|
(0006801)
|
Tolik
|
05-05-2012 18:27
|
|
Тогда сделайте простейший zmp, например, для maps.by |
|
|
(0006802)
|
vasketsov
|
05-05-2012 18:29
(edited on: 05-05-2012 18:33) |
|
Вот буквально для построения запроса из заголовка темы ничего больше и не надо.
Он (скрипт) буквально и есть в сообщении от (26-04-2012 12:28):
1. Меняем Round на Trunc в тексте скрипта.
2. УРЛ по умолчанию:
maps.by:8080/geoserver/gwc/service/wms?LAYERS=gkgc%3Acache_mapsby&STYLES=&FORMAT=image%2Fpng&TILESORIGIN=239373.209%2C5684923.453&TILED=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&WIDTH=256&HEIGHT=256&BBOX=
3. Не знаю что за origin.
|
|
|
|
Вощем нужен совет от разработчиков: сделать его как свойство у IConverter (и тогда он будет доступен везде в коде и в паскальскрипте, и будет создаваться только по требованию)?
Ну и вообще мысли по теме какие есть. |
|
|
|
Я бы предложил прописать EPSG дополнительного конвертера в параметрах карты, тобишь в params.txt, а в самом скрипте уже использовать готовый, или выдавать ошибку если дополнительный конвертер не задан или не можем создать. |
|
|
|
>прописать EPSG дополнительного конвертера в параметрах карты, тобишь в params.txt
В обсуждаемой формулировке не прокатит.
Карта одна - обычный LonLat - а запросы для скачивания тайлов строятся с разными EPSG в зависимости от зоны (в примере это определяется по левой координате). Даже автоматом это не определить, потому что будет глюк, если между L и R будет граница зоны.
Но это в этом конкретном случае. Вполне может быть что в случае сильно других проекций может быть задана одна настройка на весь мир. Тогда конечно может и надо в params заводить переменную. Но то что только лишь ей не обойтись - это факт.
В итоге я так понимаю надо делать до двух объектов Proj4Conv на карту, один внутренний (для создания по данным из params.txt), а второй настраиваемый из скрипта (по умолчанию равный первому, в том числе NIL, и если отсутствует - создавать по первому требованию). |
|
|
(0006847)
|
Tolik
|
07-05-2012 11:12
(edited on: 07-05-2012 11:16) |
|
Попробовал сделать maps.by.epsg.zmp
Не работает :(
Программа формирует такой URL (в районе Минска, z12):
http://maps.by:8080/geoserver/gwc/service/wms?LAYERS=gkgc%3Acache_mapsby&STYLES=&FORMAT=image%2Fpng&TILESORIGIN=239373.209%2C5684923.453&TILED=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&WIDTH=256&HEIGHT=256&BBOX=527751.285126273,5967196.404600956,539217.096580412,5978801.120182994&SRS=EPSG:32635
Сервер выдаёт ошибку:
400: Requested horizontal resolution: 44.78832599273028 , best match: 27.99998488 exceeds 10% threshold. Perhaps the client is configured with an incorrect set of scales (resolutions), or the DPI setting is off compared to the one in GWC ?
Хороший URL:
http://maps.by:8080/geoserver/gwc/service/wms?LAYERS=gkgc%3Acache_mapsby&STYLES=&FORMAT=image%2Fjpeg&TILESORIGIN=239373.209%2C5684923.453&TILED=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG%3A32635&BBOX=526093.0541712,5971643.2981712,544013.0444944,5989563.2884944&WIDTH=256&HEIGHT=256
Но масштаб на maps.by не совпадает с гугловским - может, в этом причина?
URL-то ПОЧТИ правильный, только размер бокса, наверно, не тот.
|
|
|
|
На terra$erverе тоже mpp н совпадает с сасовским и фиксирован (из закрытого списка). Это уже не вопрос к проекции, это значит что координаты в BBOX не независимые (и например правая должна считаться через левую исходя из mpp и width). А может быть можно width изменить, чтобы BBOX остался запрошенным. |
|
|
|
Собираюсь добить тему с proj4.
Сейчас есть примеры карт, для которых было бы целесообразным указание EPSG на всю область определения карты?
Для того же terra$erverа EPSG определяется исходя из зоны UTM, то есть одной настройкой на весь мир не обойтись. А есть, для кого обойтись (из существующих сейчас сервисов)? |
|
|
(0007152)
|
Tolik
|
22-05-2012 05:32
(edited on: 22-05-2012 05:42) |
|
А вот в первых двух комментах глобус Москвы - можно прикрутить?
Хрестоматийная карта Мальмо: http://sasgis.org/forum/viewtopic.php?p=26181#p26181
Ещё помню делал карту Израиля, намучался, а результат фиговый: http://sasgis.org/forum/viewtopic.php?p=20062#p20062
Правда, с Израилем непонятно, какой там EPSG.
А вот Самара - EPSG 4326: http://sasgis.org/forum/viewtopic.php?p=25557#p25557
|
|
|
(0007155)
|
vasketsov
|
22-05-2012 08:12
(edited on: 22-05-2012 11:33) |
|
Вообще-то EPSG:4326 и сейчас уже работает, через обычные метрические координаты.
Сейчас накидаю сюда ссылок на параметры proj4, и погляжу чего интересного есть. Ибо сам пока не очень понимаю, какую именно проецию как указать для proj4.
Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5
http://spatialreference.org/ref/epsg/2399/
+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs
Pulkovo 1995 / Gauss-Kruger CM 57E
http://spatialreference.org/ref/epsg/2469/
+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs
Pulkovo 1995 / 3-degree Gauss-Kruger zone 15
http://spatialreference.org/ref/epsg/2649/
+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs
Вощем вопрос на миллион - как параметры из
Spatial Reference: PROJCS["Moscow Coordinate System",GEOGCS["GCS_Krasovsky_1940",DATUM["D_Krasovsky_1940",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",37.4998],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",55.667],UNIT["Meter",1.0]]
упаковать в proj4.
Ну и шведская заодно )))
http://spatialreference.org/ref/epsg/3008/
SWEREF99 13 30 EPSG:3008
+proj=tmerc +lat_0=0 +lon_0=13.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
(строка с плюсиками везде - это строка инициализации proj4 для указанной проекции).
|
|
|
(0007163)
|
vasketsov
|
23-05-2012 09:30
(edited on: 23-05-2012 09:54) |
|
В итоге безотносительно выдумывания настроек роекций для конкретной карты в окончательном виде (не без помарок и возможных недочётов, но общая логика) получилось следующее:
1. В zmp строковые параметры Proj4Args и Proj4Path. Первый - аргументы инициализации proj4, второй - путь до вспомогательных файлов proj4. Эти два параметра необходимы и достаточны (в настоящий момент) для любой настройки proj4. Чаще всего Proj4Path можно не использовать вообще (то есть путь будет пустой строкой).
2. Указание значения параметра Proj4Args является обязательным для инициализации proj4. Пусть даже там будет заведомая ерунда. Если нет Proj4Args - proj4 для конвертера координат инициализироваться не будет. На основании существующих парамеров EPSG, projection, sradiusa и sradiusb инициализация proj4 не производится. Это сделано специально, потому как все те сервисы, на которые я налетел, при запросах используют не одну конкретную EPSG, а их семейство (в зависимости от зоны используется конкретное значение EPSG).
2а. Ровно одно исключение. Если указано значение для Proj4Path и НЕ указано значение для Proj4Args - инициализация proj4 будет проведена на основе значения EPSG и Proj4Path.
3. Значение для Proj4Args может быть двух типов. Простой вариант - указание типа 'Proj4Args=EPSG:32637' (полностью равносильно вызову функции SetEPSG для указанного целого кода EPSG в скрипте). Полный вариант - указание строки типа '+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs' (равносильно вызову функции SetProj в скрипте).
4. Значения, используемые при инициализации proj4, запоминаются внутри, и повторной инициализации не производится. То есть в скрипте можно смело использовать SetEPSG сколько угодно раз, если код EPSG не меняется - до proj4 это даже не дойдёт.
5. Экспорт и прочая аналогичная функциональность использует предварительно созданные конвертеры (собственно как и было раньше), важно только, что предварительные конвертеры создаются без инициализации proj4 и используются в том числе для всех карт, для которых не выполнена инициализация proj4.
6. Пришлось внести косметические изменения в интерфейсы, так что скрипты, которые использовали proj4, придётся поправить. Как именно - в следующем сообщении. Скрипты - везде имеется в виду паскальскрипт.
|
|
|
(0007164)
|
vasketsov
|
23-05-2012 09:38
(edited on: 23-05-2012 09:39) |
|
Изменения в скриптах вследствие измененйи в интерфейсах следующие (относительно того что было в сообщениях от 05-05-2012 19:23, 26-04-2012 12:28 и других в этой теме):
1. Интерфейс proj4 стал выглядеть так:
IProj4Converter = interface
function Available: Boolean; stdcall;
function SetProj(const AArgs, APath: String): Boolean; stdcall;
function SetEPSG(const AEPSG: Integer; const APath: String): Boolean; stdcall;
function LonLat2XY(const AProjLP: TDoublePoint): TDoublePoint; stdcall;
function XY2LonLat(const AProjXY: TDoublePoint): TDoublePoint; stdcall;
end;
2. Доступ к нему стал через функцию function GetProj4Converter: IProj4Converter; stdcall; от объекта Converter (интерфейс ICoordConverter в скрипте).
3. Объект Proj4Conv теперь не создаётся - при необходимости его надо определять руками в секции var и присваивать ему значение. Пример ниже.
4. Если есть сомнения, что пихать в SetProj или SetEPSG вторым параметром - пихать туда пустую строку.
Пример (автоопределение зоны UTM и в зависимости от этого установка EPSG):
var
TL,M: TDoublePoint;
BR,N: TDoublePoint;
BL,K: TDoublePoint;
TR,L: TDoublePoint;
CC,C: TDoublePoint;
VEPSG: Integer;
Proj4Conv: IProj4Converter;
begin
TL.x := GetLLon;
TL.y := GetTLat;
BR.x := GetRLon;
BR.y := GetBLat;
BL.x := GetLLon;
BL.y := GetBLat;
TR.x := GetRLon;
TR.y := GetTLat;
CC.x := (GetLLon+GetRLon)/2;
CC.y := (GetTLat+GetBLat)/2;
// get zone
VEPSG := (Trunc(TL.x) div 6) + 32631;
Proj4Conv := Converter.GetProj4Converter;
Proj4Conv.SetEPSG(VEPSG,'');
if Proj4Conv.Available then begin
// convert
M := Proj4Conv.LonLat2XY(TL);
N := Proj4Conv.LonLat2XY(BR);
K := Proj4Conv.LonLat2XY(BL);
L := Proj4Conv.LonLat2XY(TR);
C := Proj4Conv.LonLat2XY(CC);
// make url
ResultURL := GetURLBase + '&tlx=' + RoundEx(M.x,6) +
'&tly=' + RoundEx(M.y,6) +
'&brx=' + RoundEx(N.x,6) +
'&bry=' + RoundEx(N.y,6) +
'&blx=' + RoundEx(K.x,6) +
'&bly=' + RoundEx(K.y,6) +
'&trx=' + RoundEx(L.x,6) +
'&try=' + RoundEx(L.y,6) +
'&ccx=' + RoundEx(C.x,6) +
'&ccy=' + RoundEx(C.y,6) +
'&llt=' + RoundEx(GetTLat,9) +
'&llb=' + RoundEx(GetBLat,9) +
'&lll=' + RoundEx(GetLLon,9) +
'&llr=' + RoundEx(GetRLon,9) +
'&sps=' + IntToStr(VEPSG) +
'&ver=' + Version;
end else begin
// not available
ResultURL := GetURLBase;
end;
end.
|
|
|
|
Из известных потенциальных проблем: поскольку конвертер proj4 один на конвертер координат - в случае параллельной скачки одной карты в разных зонах при автоопределении зоны возможна "война EPSG", так как конвертер EPSG в рамках одного выполнения одного скрипта не блокируется от сторонних изменений. |
|
|
(0007166)
|
Tolik
|
23-05-2012 10:13
|
|
Ох, очень трудно понять такие длинные слова: интерфейсы, аргументы, инициализации, когда в голове опилки :)
Сделайте, пожалуйста, один любой рабочий ZMP. C одной предустановленной EPSG. Сразу всё будет ясно.
Офф: Почему это вдруг строки в постах перестали переноситься? |
|
|
(0007167)
|
zed
|
23-05-2012 10:46
|
|
>Почему это вдруг строки в постах перестали переноситься?
vasketsov своими постами порвал все шаблоны и запутал все извилины :) |
|
|
(0007168)
|
vasketsov
|
23-05-2012 11:29
(edited on: 23-05-2012 11:35) |
|
>рабочий ZMP
Мне мало интереса возиться с тем, что мне неинтересно, Швеция там или Израиль. Или какие-то криворукие рисунки линиями по Москве.
Я могу мучительно долго сидеть и думать, как конвертнуть Spatial Reference: PROJCS["Moscow Coordinate System",GEOGCS["GCS_Krasovsky_1940",DATUM["D_Krasovsky_1940",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",37.4998],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",55.667],UNIT["Meter",1.0]]
в параметры для proj4, но только при условии пользы лично для меня, так что извините.
Например я могу выложить старый zmp от терра$erver-а (до того как они закодировали параметры), сейчас он уже не работает, но раньше работал. Надо?
Есть сервис со снимками по РФ в неподдерждиваемой проекции, чтобы его окучить? Тогда давайте готовый zmp, где вроде бы почти всё есть, только проекцию надо вправить нужную.
Впрочем если так уж нужен рабочий zmp целиком - приаттачил для t@rra$@rv@rа (для снимка дороги Лежнево-Хозниково-Шуя). Логика вся скрыта в локальном прокси. Но zmp сам по себе рабочий (с новой версией интерфейсов).
|
|
|
(0007169)
|
vasketsov
|
23-05-2012 18:57
(edited on: 23-05-2012 19:10) |
|
Сделал карту karta-dv, проверял только Хабаровск, на гибрид НЯК ложится в пределах погрешности рисования, тайлы стыкуются, хотя может чего и не углядел.
http://www.karta-dv.ru/?page=1
Проекция там такая:
http://spatialreference.org/ref/epsg/28483/
Чтобы автоматически работало Proj4Args=EPSG:2513 в zmp - это в завтрешней сборке только будет, только что добавил это.
Имею в виду поддержку проекций семейств Pulkovo 1995 / Gauss-Kruger CM и Pulkovo 1942 / Gauss-Kruger CM (это EPSG:2463-2491 и EPSG:2492-2522).
Кому неохота ждать завтрашнюю - проекцию надо указывать как '+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs' (точное значние смотреть по ссылке на spatialreference.org)
На всякий случай сделал проверку выхода за границы зоны на +1 или -1, думаю хватит.
Как пример для ковыряния - думаю вполне покатит.
|
|
|
(0007170)
|
zed
|
23-05-2012 19:02
|
|
Добавить proj4.dll в ночнушку? |
|
|
|
А зачем? У нас есть в основном репо такие извращённые карты? |
|
|
(0007172)
|
Tolik
|
23-05-2012 19:23
|
|
Пока нет dll, и карты не появятся в репо :)
В завтрашней сборке проверю Proj4Args=EPSG:2513, я именно этого и хотел, чтоб просто указывать номер.
Спасибо. |
|
|
(0007173)
|
vasketsov
|
23-05-2012 19:31
(edited on: 23-05-2012 19:33) |
|
Чтобы просто указывать номер - это надо делать поддержку в коде для этого.
Можно конечно ходить налету и качать по ссылкам типа
http://spatialreference.org/ref/epsg/28483/proj4/
Но если сайт завалится - пиши пропало.
Сейчас можно указывать просто как EPSG:N в zmp для таких N:
53004 (точнее это ESRI:53004, но указывать в zmp надо EPSG:53004);
3785;
3395;
4326;
2463-2491;
2492-2522;
32601-32660;
Прочие значения неизвестны, и надо подставлять полную форму (которую брать по ссылкам типа http://spatialreference.org/ref/epsg/28483/proj4/).
|
|
|
(0007174)
|
zed
|
23-05-2012 19:34
(edited on: 23-05-2012 19:37) |
|
>Можно конечно ходить налету и качать по ссылкам типа
А можно брать из файлика. Ща приложу.
Его можно распарсить ручками, превратить в юнит и вкомпилить в САС.
|
|
|
|
Для целей тестирования хитрых параметров в нестандартных проекциях приаттачил UTMZoneConverter.rar. Там вбиты параметры для EPSG:32640 (с неё у меня всё и начиналось, а пересобирать лениво) - пусть это не пугает, это для любой проекции. Если DLL от proj4 лежит в папке с сасом - эту прогу кидайте туда же.
Пользоваться так:
1. Идём на http://spatialreference.org и ищем нужную (ну или максимально похожую) проекцию.
2. На её страничке жмакаем на proj4 и получаем строку инициализаии proj4 (должна быть строка вида +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs).
3. Эту строку встарвляем в первое поле, второе оставляем пустым.
4. Снизу вводим координаты lon lat (только десятичная форма!) - по кнопке они пересчитываются.
5. Большое текстовое поле внизу можете использовать как попало ))))). |
|
|
|
Раз уж vdemidov все тестовые скрипты переписал - пусть на нём и висит:
1. Надо пример, как в новой версии писать скрипты. Хотя бы на примере приаттаченной карты karta-dv.
2. Надо всё же восстановить работоспособность panoramio, если уж изгадил закачку аттачментов из скрипта и проги, с новой ночнушки оно отвалится. Соответственно сделай плиз новый zmp с примером (в соответствующей теме). |
|
|
|
>1. Надо пример, как в новой версии писать скрипты. Хотя бы на примере приаттаченной карты karta-dv.
Не вопрос. Сейчас приложу, только работать оно будет с завтрашнего билда, ибо там в Pascal Script бага небобьшая была.
>2. Надо всё же восстановить работоспособность panoramio
Увы. В ближайшее время не предвидится. Переделывать полностью некогда, а текущая реализация мне крайне сильно не нравится. Не нравится настолько, что предпочту ее вообще удалить. |
|
|
(0007260)
|
zed
|
31-05-2012 16:12
|
|
А как насчёт подключить и все остальные проекции из файлика epsg? |
|
|
|
А просто прописать строку инициализации кто мешает? |
|
|
(0007262)
|
zed
|
31-05-2012 16:23
|
|
Зачем пугать народ этой строкой, если можно обойтись простым кодом epsg? Причём, без особых заморочек. |
|
|
(0007263)
|
zed
|
31-05-2012 16:26
(edited on: 31-05-2012 16:29) |
|
Насколько часто может дёргаться функция TProjConverterFactory.GetArgsByEpsg?
Можно ведь и по регэспу парсить тот текстовик (пара секунд на это дело уйдёт, а может и не уйдёт) прямо в рантайме.
|
|
|
|
ИМХО нет смысла держать в памяти мегабайт текстовы строк просто так. Но добавить это элементарно. |
|
|
(0007265)
|
Tolik
|
31-05-2012 17:33
|
|
|
|
(0007266)
|
zed
|
31-05-2012 17:48
|
|
>мегабайт текстовы строк
200-300kB. Там половина - комменты. |
|
|
|
Та ну ладно. Там половина строк коменты, но они очень короткие. Но как я уже сказал, сделать не сложно. |
|
|
(0007268)
|
zed
|
31-05-2012 19:45
|
|
Скомпилировал proj480.dll - без тестового zmp сам проверить как она работает не могу :( |
|
|
|
Так прикреплен же сюда тестовый zmp |
|
|
(0007270)
|
zed
|
31-05-2012 19:49
|
|
Упс, точно, не заметил. Ща попробую. |
|
|
(0007271)
|
zed
|
31-05-2012 20:01
|
|
Угу, всё работает. Ща обновлю саса. |
|
|
|
>Переделывать полностью некогда
А зачем сломал тогда?
>текущая реализация мне крайне сильно не нравится
Аргументы? Мне может тоже много чего в этой жизни не нравится.
>предпочту ее вообще удалить
Единолично предпочтёшь, без аргументов?
Может повзрослеть пора? |
|
|
|
Никаких делфовских объектах в интерфейсах. Вот основной аргумент. |
|
|
(0007277)
|
vasketsov
|
01-06-2012 17:33
(edited on: 01-06-2012 17:38) |
|
>Вот основной аргумент
Этот аргумент я могу понять.
Но я не вижу в DownloadFileToLocal ни одного интерфейса ))).
Как и причин ломать это прямо сейчас.
Если ты решил SimpleDownloader довести до ума (в контексте всего проекта), унифицировать его и вытащить в скрипт - могу только порадоваться, но почему не предусмотреть "переходный период", чтобы (хотя бы одним способом из двух) работало то, что давно уже сделано и многими используется?
Судя по всему есть как минимум ещё один аргумент, более реальный и пока что неозвученный.
зы. В общем ставишь в странное положение. С одной стороны мне прямо сейчас надо работающую функциональность, потому что сваливаю на днях, но с другой стороны обновить проект ради других "косяков" не могу, опять же ни залить ни вылить (хотя сейчас это как раз не критично). Руками патчить код тоже не улыбается. В общем, в очередной раз призываю к внимательности, думать ДО того как делать полезно почти всегда.
|
|
|
(0007457)
|
Tolik
|
18-06-2012 09:02
|
|
vdemidov, а инструкции какие-то будут?
Как пользоваться?
Какой zmp - образец? |
|
|
|
Образец давно здесь приаттачен. Инструкции читаем:
http://sasgis.org/wikisasiya/doku.php/описание_паскаль_скриптов |
|
|
(0007512)
|
zed
|
19-06-2012 07:18
|
|
Эти новые EPSG работают только в скриптах для пересчёта координат или в params.txt их тоже можно использовать? Или там только те 3 старые дефолтные проекции остались? |
|
|
(0007514)
|
vdemidov
|
19-06-2012 07:36
(edited on: 19-06-2012 07:47) |
|
>Или там только те 3 старые дефолтные проекции остались?
Только в скриптах. 3 старые проекции будут еще очень-очень-очень долго.
ЗЫ: Но в юнитах вполне можно пользоваться новыми конвертерами, если для каких-то специфических задач нужна хитрая проекция. Например в геокодерах.
|
|
|
(0013284)
|
Tolik
|
19-11-2013 11:05
(edited on: 19-11-2013 11:06) |
|
Добавил рабочий zmp:
navici.zmp.zip © Zed отсюда: http://sasgis.org/forum/viewtopic.php?p=35241#p35242
|
|